重学前端是程劭非(winter)在极客时间开的一个专栏,在此主要整理个人学习笔记。若有侵权,请联系我,谢谢。javascript
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 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是es6引入的新的变量声明模式,为了实现let,es6在运行时引入了块级做用域
如下语句会产生let使用的做用域:
新概念。
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是会有不一样的行为。