重学前端-闭包和执行上下文

说明

重学前端是程劭非(winter)在极客时间开的一个专栏,在此主要整理个人学习笔记。若有侵权,请联系我,谢谢。javascript

执行上下文在不一样版本的概念

var声明与赋值

var声明可以穿透if、for等语句前端

当即执行函数,经过声明一个函数,而且当即执行,来构建一个新的域。来控制var的范围java

语法规定function关键字开头是函数声明,为了变成函数表达式,能够在前面加东西。es6

  • 加括号
(function(){
    var a;
    //code
}());


(function(){
    var a;
    //code
})();
复制代码

加括号有个缺点,就是若是在最后不加分号,括号会被解释为上一行代码最末的函数调用。所以有些作法是c#

  • 加前面加分号
;(function(){
        var a;
        //code
    }())
    
    
    ;(function(){
        var a;
        //code
    })()
复制代码
  • void 关键字法
void function(){
        var a;
        //code
    }();
复制代码

void表示忽略后面表达式的返回值,变成undefined,在使用当即执行函数时,咱们并不关系函数的返回值bash

在with用法里, var 的特性会致使声明的变量和被赋值的变量是两个 bapp

var b;
void function(){
    var env = {b:1};
    b = 2;
    console.log("In function b:", b); // 2
    with(env) {
        var b = 3;  
        console.log("In with b:", b); //3
    }
}();
console.log("Global b:", b); // undefined
复制代码

在with声明的b做用到了外部function的环境上,对两个域(with和function)产生了做用,这是用with的弊端。函数

这里我修改一下,看看不一样的写法,b的值有什么不一样学习

var b;
void function(){
    var env = {b:1};
    b = 2;
    console.log("In function b:", b); //2
    var b = 3;
}();
console.log("Global b:", b);  //undefined
复制代码

这个时候b仍是不一样,由于在当即执行函数里用了var关键字声明了b,全部b=2赋值的是该做用域的b,不是全局做用域的b。spa

var b;
void function(){
    var env = {b:1};
    b = 2;
    console.log("In function b:", b);   //2
}();
console.log("Global b:", b);  //2
复制代码

这个时候b是同一个b。这个是做用域链在查找变量的时候,若是在内部的做用域找到这个变量的,就会中止查找,若是找不到,会去外层做用域继续查找,直到找到为止。

let

let是es6引入的新的变量声明模式,为了实现let,es6在运行时引入了块级做用域

如下语句会产生let使用的做用域:

  • for
  • if
  • switch
  • try/catch/finally

Realm

新概念。

Realm中包含一组完整的内置对象,并且是复制的关系

var iframe = document.createElement('iframe')
document.documentElement.appendChild(iframe)
iframe.src="javascript:var b = {};"

var b1 = iframe.contentWindow.b;
var b2 = {};

console.log(typeof b1, typeof b2); //object object

console.log(b1 instanceof Object, b2 instanceof Object); //false true
复制代码

b1和b2是由一样的代码在不一样的Realm中执行,在用instanceof是会有不一样的行为。

相关文章
相关标签/搜索