@buoge
2017-11-21T06:39:45.000000Z
字数 817
阅读 1061
this关键字前端
https://github.com/creeperyang/blog/issues/16
1.1提到,var 声明的变量会在任意代码执行前处理,这意味着在任意地方声明变量都等同于在顶部声明——即声明提升。1.2特意强调了函数定义,因为声明提升中,需要综合考虑一般变量和函数。在JavaScript中,一个变量名进入作用域的方式有 4 种:Language-defined:所有的作用域默认都会给出 this 和 arguments 两个变量名(global没有arguments);Formal parameters(形参):函数有形参,形参会添加到函数的作用域中;Function declarations(函数声明):如 function foo() {};Variable declarations(变量声明):如 var foo,包括_函数表达式_。函数声明和变量声明总是会被移动(即hoist)到它们所在的作用域的顶部(这对你是透明的)。而变量的解析顺序(优先级),与变量进入作用域的4种方式的顺序一致。一个详细的例子:function testOrder(arg) {console.log(arg); // arg是形参,不会被重新定义console.log(a); // 因为函数声明比变量声明优先级高,所以这里a是函数var arg = 'hello'; // var arg;变量声明被忽略, arg = 'hello'被执行var a = 10; // var a;被忽视; a = 10被执行,a变成numberfunction a() {console.log('fun');} // 被提升到作用域顶部console.log(a); // 输出10console.log(arg); // 输出hello};testOrder('hi');/* 输出:hifunction a() {console.log('fun');}10hello*/
