区别 代码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的 小动作偶,他没有告诉你,就传入进入了,但是你不能看不到他偶