代码块与作用域
顶层作用域声明的变量哪里都可访问,虽然在JS中可以跨越块级作用域,但是这样访问变量容易引起混乱,产生bug,我们应避免跨越块级作用域。在ES6中,新增的let关键字禁止了块级作用域变量的访问,这样可以有效的避免错误发生。
var x=0;
funcyion fun()
{
console.log(x);
var x=1;
x++;
}
fun();
上面这段代码的运行结果为unedefined,在JS中,一个作用域里声明的变量在这个作用域里只用一个指向,因为子作用域里又声明了另一个重名的局部变量x,导致腹肌作用域的变量被覆盖而无法访问。应避免起重名的变量名,使每个作用域都变得严谨。
隐藏参数this
this的指向(在对象中的用法)
- 无任何前缀的函数调用时,this指向全局对象。
- 方法调用时,this指向方法所在的对象或被调用的对象。
- 构造函数里,this指向新生成的实例。
在函数中,将含有this的对象方法取出来单独执行,此时this指向全局对象。 - apply/call调用时,this指向apply/call方法中的第一个参数。
apply/call的功能是通过传参的方式,强制函数内的this指定某一对象,this的引用会被指向apply/call的第一个参数。
apply与call的不同:对其他参数的传递方式不同,对于apply,剩余的参数将通过数组来传递,而call直接按参数列表传递。
var display=function(words)
{
console.log(this.name+"said:"+words[0]+""+words[1]+".");
}
display.call({name:"bower"},["I'm a","robot"])
//上句等同于display.apply({name:"bower"},[["I'm a","robot"]])
因为words本身是一个数组,当使用apply传递时应将words[]放入数组中。
遇到的问题
var robot_1 = {
name : "bower",
say : function(){
console.log(this.name);
}
}
var robot_2 = {
name : "cup"
}
robot_2.say = robot_1.say;
robot_2.say()
以上代码执行结果为 cup
robot_2的say属性值不应该是经赋值后的robot_1执行say函数的值吗?但是robot_2没有say函数,执行robot_2.say()后的结果为什么会是cup?
——————
robot_1的函数say赋给robot_2,robot_2有了robot_1方法,输出的便是cup。
.....