javascript高级程序设计7-8

函数

声明函数
function name(){},这个存在变量提升,而var name = function(){}不存在变量提升

递归

function factorial(num){
    if(num<=1){
        return 1
    }else{
        return num*arguments.callee(num-1) //arguments.callee === factorical
    }
}

闭包

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见的方式就是在函数内部创建另一个函数

######当函数返回了一个闭包时。这个函数的作用域将会一直在内存中保存到闭包不存在为止

推荐

例一
var name = "The Window";
var object = {
  name : “My Object”,
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
alert(object.getNameFunc()()); //The Window
例二
例三
下面的例子中
result[i] = function(){
    return i
}
每一个都是返回i,这个i的作用域在f()内,而自此时f()中的i=3,所以每个都返回3
而当用for–in时返回的是0,1,2,这是为什么呢?继续探究
修改代码如下
function f(){
    var result = new Array()
    for(var i = 0;i<3;i++){
        result[i] = function(){
            console.log("内:"+this)
            return i;
        }
    }
    return result
}
var result = f()
console.log(result)  //Array(3)
3个f(),这里的f()不是上面的f函数
console.log(result[0]())
/*
* 内:function (){
*            console.log("内:"+this)
*            return i;
*        },function (){
*            console.log("内:"+this)
*            return i;
*        },function (){
*            console.log("内:"+this)
*            return i;
*        }
*
 */
console.log(result[0])
/*ƒ (){
*            console.log("内:"+this)
*            return i;
*        }
*/
结果如上,console.log(result0)与console.log(result[0])可以合理的解释为什么全是3
而且内this指向的是result数组所以会有三个function(){}
疑问:
为什么console.log(“内:”+this)会出来3个function(){}
ES6
function f(){
    let result = new Array()
    for(let i = 0;i<3;i++){
        result[i] = function(){
            return i;
        }
    }
    return result
}
let result = f()
for(let i=0;i<3;i++){
    console.log(result[i]())
}
结果是0,1,2
块级作用域
(function(){
    //这里是块级作用域
})()
作用:块级作用域是一个独立的作用域,多人协作时每个人有每个人的块级作用域可以互不影响,防止命名冲突

BOM

window对象
window对象是指浏览器打开的窗口
window.名称 //全局对象
window.frame[‘name’]
窗口位置
chrome\opera\safari—-screenTop|screenLeft
firefox—-screenX|screenY
var leftPos = (typeof window.screenLeft == 'number')?window.screenLeft:window.screenX;
var rightPos = (typeof window.screenTop == 'number')?window.screenRight:window.screenY;

window.moveTo(0,0);    //移动到0,0
window.moveBy(0,100);  //向下移动100像素
窗口大小
outerWidth、outerHeight----返回浏览器窗口本身的大小
innerWidth、innerHeight----返回容器中试图区的大小
resizeTo()、resizeBy()----可以调整浏览器窗口的大小
导航和打开窗口
window.open()----打开新的浏览器窗口
参数:URL、窗口目标、特性字符串、boolean(新页面是否取代浏览器历史纪录中当前加载页面)
第二参数可以是:_self、_parent、_top、_blank
opener属性:保存着打开他的原始窗口对象
延时间歇延时
setTimeout()、setTnterval()、clearTimeout()
系统对话框
alert()、confirm()、prompt()
location对象
即是window的对象属性,也是document的对象属性
console.log(window.location) //查看属性
查询字符串参数
/* 解析查询字符串 返回包含所有参数的一个对象 */  
function getQueryStringArgs(){  

   //取得查询字符串并去掉开头的问号  
   var qs = (location.search.length > 0 ?       location.search.substring(1) : '');  

   //保存数据的对象  
   args = {};  

   //取得每一项  
   var items = qs.length ? qs.split('&') : [],  
  item = null,  
  name = null,  
  //在for循环中使用  
  i = 0, len = items.length;  

   //逐个将每一项添加到args对象中  
   for(i = 0 ; i < len; i++){  
      item = items[i].split('=');  
      name = decodeURIComponent(item[0]);  
      value = decodeURIComponent(item[1]);  

      if(name.length){  
         args[name] = value;  
      }  
   }  

   return args;  
}  

javascript高级程序设计7-8
https://zhangfuli.github.io/2017/10/18/javascript高级程序设计7-8/
作者
张富利
发布于
2017年10月18日
许可协议