js高级之作用域

作用域

先来看一段代码

在js中,函数嵌套是非常普遍的, 那么在函数嵌套中,对变量是如何寻找的呢?
答:首先在函数内寻找, 寻找不到, 则在外层寻找 …直到…全局(window)区域

<script>
var a = 1;
function fun1() {
var b = 2;
<!--声明c变量-->
var c = 3
function fun2() {
var c = 4;
alert(a + b + c);
}
return fun2();
}
fun1();
// 结果为7 (c已经找到, 所以不往上寻找)
</script>

声明var的作用

var是在函数运行的上下文中,声明一个变量 , 如果不加var , 则是一个赋值操作,
不要片面的理解为这是个全局变量, 比如下面的代码: (函数f2内的e往上找,当找到f
1内的 var e时 , 使得 var e = 2 , 不再往上寻找, 所以e与ee都为undefined )

<script>


function f1() {

var e;

function f2() {
e = 2;
var ee = 2;
}
return f2();
}

f1();
console.log(e);
console.log(ee);


// 结果为 : e is not undefined , ee is not undefined

</script>

下面代码中e没有加var ,仅仅是一个赋值操作 , 它开始在f2函数中寻找这个变量 , 一直没找到, 直到找到最外面的window , 于是就就window.e=2 .

<script>
function f1() {
function f2() {
e = 2;
var ee = 2;
}
return f2();
}
f1();
console.log(e);
console.log(ee);
// 结果为 2 , ee is not undefined
</script>

js作用域面试题

第一题

    <script>
var a = 'one';
function f1() {
console.log(a); //one
console.log(b); // b is not undefined

// 实际上出错, 并没有执行到这
b = 'two'; //此时b并没有加var
// 若执行完,则才把全局的b赋上值
}
f1();
// 结果为 one , b is not undefined
</script>

再比如, 把b加var之后

<!--这里涉及到词法分析, js代码在整体运行分-->
<!--1.词法分析期-->
<!--2.运行期-->
<!--js代码从上往下执行,我们知道, 一个声明变量, 是存在函数的运行上下文中-->
<!--1.词法分析期:以下面代码为例, 先分析f1函数, 函数内有 b 这个局部变量, 但此时函数未执行, 因此a,b的值都为undefined-->
<!--2.运行期: 运行期时, 最后才真正的是声明了b变量-->
<script>
var a = 'one';

function f1() {
console.log(a); //one
console.log(b); // b is not undefined


var b = 'two'; // 声明b变量

}

f1();
// 结果为 one , b is not undefined
</script>
分享到