区别
代码1:
var scope = "global scope";
function check(){
var scope = "local scope";
function f() {return scope;}
return f;
}
check()(); //local scope
代码2:
var scope = "global scope";
function check(){
var scope = "local scope";
function f() {return this.scope;}
return f;
}
check()();//global scope
分析
代码1 与代码2 只是多 了一个this。就发生了,结果就发生了变化。
为啥呢?
答案:就是闭包和上下文。
闭包:函数的执行时依赖作用域的,这个作用域是在函数定义的时候决定的,不是函数调用的时候决定的。----》也就是说,f函数中的 scope变量的作用域, 在整个函数定义的时候,已经决定了。 ----也就是包裹他的函数的scope。
那这就奇怪了?为啥代码2 又变成了全局作用域下的变量了你额?
其实我们观察到,代码2中的this,他就是代指的当前的上下文。【f()函数在执行的时候,其实有一个小动作,我们没有看到的,那就是 传递了上下文 ,到f函数中去了】
也就是:
f(window){}将当前的上下文,(此时是window传入到f函数中去了。scope也就是 全局的变量了)
由此,我们来看
function check(){
var scope ="local scope";
function f() {return this.scope;}
return f;
}
//check()();
var obj ={
scope:"obj"
}
check().call(obj) //obj----因为现在的小动作,传参 是obj的上下文。
总结
闭包:作用域在定义的时候决定。
小动作:传入上下文参数的小动作,就破坏了这种规则。(用this的时候 ,默认 就是 悄悄的做这个 传入上下文小动作)
记住:这个传入this的 小动作偶,他没有告诉你,就传入进入了,但是你不能看不到他偶