变量的作用域&搜索规则
如果在内层作用域中声明了和外层作用域中同名的变量,那么这个变量是不会把外层的同名变量覆盖的.
搜索规则:
01 在作用域中如果访问(读取|设置)某个变量,先在当前作用域中搜索,如果找到那么就直接使用
02 如果没有找到,那么就向上一级作用域中继续搜索,找到则使用,没有找到就重复上面的过程
03 直到0级作用域链
demo:
惰性函数
函数的真正内容在调用了一次之后才确定,能够实现自我更新;
function foo(){
console.log("foo!");
//主要处理初始化操作......
//实现函数的自我更新
foo = function (){
console.log("foo! foo!");
}
}
foo(); //foo!
foo(); //foo!foo!
foo(); //foo!foo!
适合应用场景:
需要先做一次性的初始化处理
在使用惰性函数的时候 有几点需要注意:
01 如果在函数上面添加了属性,那么进行自我更新之后这个属性会丢失;
示例:
function f1(){
console.log("f1");
f1 = function(){
console.log("新的函数体");
}
}
//函数是一个对象,因此可以添加属性
f1.des = "描述信息";
f1(); //f1
f1(); //新的函数体
console.log(f1.des); //描述信息 ? undefined(正确) 在函数更新之后属性丢失
02 如果把函数赋值给其他的变量,那么我们以变量的方式来调用,将会永远执行旧函数,不会实现自我更新!
示例:
function f1(){
console.log("f1");
f1 = function(){
console.log("新的函数体");
}
}
//把函数赋值给变量
var func = f1;
func(); //f1
func(); //f1
func(); //f1
f1();
var obj = {};
obj.demoFunc = f1;
obj.demoFunc(); //f1
obj.demoFunc(); //f1
03 如果把函数赋值给对象,成为对象的方法, 那么我们以对象的方法来调用,也是不会更新;
即时对象初始化方法
基本写法:({init:function (){}}).init();
使用场景:
和惰性函数定义很像,如果代码中需要做一些一次性的初始化操作,那么就可以用这种方法:
({
name:"张三",
age:20,
showName:function(){
console.log(this.name);
},
showAge:function(){
console.log(this.age);
},
init:function(){
//做一些需要一次性处理的初始化操作
//在对象的方法中调用该对象的其他方法:需要使用this前缀
this.showName();
this.showAge();
}
}).init();