[关闭]
@buoge 2017-11-21T14:39:45.000000Z 字数 817 阅读 865

深入理解JS中声明提升、作用域(链)和this关键字

前端


https://github.com/creeperyang/blog/issues/16

声明提升

  1. 1.1提到,var 声明的变量会在任意代码执行前处理,这意味着在任意地方声明变量都等同于在顶部声明——即声明提升。1.2特意强调了函数定义,因为声明提升中,需要综合考虑一般变量和函数。
  2. JavaScript中,一个变量名进入作用域的方式有 4 种:
  3. Language-defined:所有的作用域默认都会给出 this arguments 两个变量名(global没有arguments);
  4. Formal parameters(形参):函数有形参,形参会添加到函数的作用域中;
  5. Function declarations(函数声明):如 function foo() {};
  6. Variable declarations(变量声明):如 var foo,包括_函数表达式_
  7. 函数声明和变量声明总是会被移动(即hoist)到它们所在的作用域的顶部(这对你是透明的)。
  8. 而变量的解析顺序(优先级),与变量进入作用域的4种方式的顺序一致。
  9. 一个详细的例子:
  10. function testOrder(arg) {
  11. console.log(arg); // arg是形参,不会被重新定义
  12. console.log(a); // 因为函数声明比变量声明优先级高,所以这里a是函数
  13. var arg = 'hello'; // var arg;变量声明被忽略, arg = 'hello'被执行
  14. var a = 10; // var a;被忽视; a = 10被执行,a变成number
  15. function a() {
  16. console.log('fun');
  17. } // 被提升到作用域顶部
  18. console.log(a); // 输出10
  19. console.log(arg); // 输出hello
  20. };
  21. testOrder('hi');
  22. /* 输出:
  23. hi
  24. function a() {
  25. console.log('fun');
  26. }
  27. 10
  28. hello
  29. */
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注