魏名华

不要偷懒,做更好的自己

Nothing


No Welcome Message

重学前端-17 | JavaScript执行(二):闭包和执行上下文到底是怎么回事?

var b = {}
let c = 1
this.a = 2;
要想正确执行它,我们需要知道以下信息: 

var 把 b 声明到哪里; 

b 表示哪个变量; 

b 的原型是哪个对象; 

let 把 c 声明到哪里; 

this 指向哪个对象。

这个问题很有意思,对理解 js 很有帮助


在只有 var,没有 let 的旧 JavaScript 时代,诞生了一个技巧,叫做:立即执行的函数表达式(IIFE),通过创建一个函数,并且立即执行,来构造一个新的域,从而控制 var 的范围。 

由于语法规定了 function 关键字开头是函数声明,所以要想让函数变成函数表达式,我们必须得加点东西,最常见的做法是加括号。
(function(){
    var a;
    //code
}());


(function(){
    var a;
    //code
})();

终于讲到这里了!!!

但是,括号有个缺点,那就是如果上一行代码不写分号,括号会被解释为上一行代码最末的函数调用,产生完全不符合预期,并且难以调试的行为,加号等运算符也有类似的问题。所以一些推荐不加分号的代码风格规范,会要求在括号前面加上分号。
;(function(){
    var a;
    //code
}())


;(function(){
    var a;
    //code
})()
我比较推荐的写法是使用 void 关键字。也就是下面的这种形式。
void function(){
    var a;
    //code
}();

js 的 let 跟 swift 不一样哦,是用来产生块级作用域的:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let


realm:这也是作用域相关的东西,完全不懂