js中变量做用域

首先看一个例子:函数

function Foo() {this

    getName = function () { alert (1); };spa

    return this;code

}
Foo中的getName理解为变量,它没有var声明, 因此先向当前Foo函数做用域内寻找getName变量,没有。
再向当前函数做用域上层,即外层做用域内寻找是否含有getName变量。
是一个从里到外寻找变量的过程, 会一直向上查找到window对象,若window对象中也没有getName属性,就在window对象中var一个getName变量(全局变量)。
 
 
先贴上几个例子的代码截图,方便从基础理解之
 
 
 
 
JavaScript的函数定义有个特色,它会先扫描整个函数体的语句,把全部申明的变量“提高”到函数顶部。
1 'use strict'; 2 
3 function foo() { 4     var x = 'Hello, ' + y; 5  alert(x); 6     var y = 'Bob'; 7 } 8 
9 foo();

对于上述foo()函数,JavaScript引擎看到的代码至关于:对象

function foo() { var y; // 提高变量y的申明
    var x = 'Hello, ' + y; alert(x); y = 'Bob'; }

var y = 'Bob';拆分为了 var y ;y='Bob';因此y的值为undefined
因此为了不各类怪异事件的发生,最好在函数开头声明须要的变量;
function foo() { var x = 1, // x初始化为1
        y = x + 1, // y初始化为2
        z, i; // z和i为undefined
    // 其余语句:
    for (i=0; i<100; i++) { ... } }
 
JavaScript默认有一个全局对象window
直接访问全局变量a和访问window.a是彻底同样的
 
'use strict'; function foo() { for (var i=0; i<100; i++) { //  } i += 100; // 仍然能够引用变量i
}

为了解决块级做用域,ES6引入了新的关键字let,用let替代var能够申明一个块级做用域的变量
'use strict'; function foo() { for (var i=0; i<100; i++) { //  } i += 100; // 仍然能够引用变量i
}
相关文章
相关标签/搜索