JavaScript变量提升
2017-05-01 15:14
183 查看
先来看一段代码,尝试写出答案。
<script>
var v1 = '这是全局变量v1';
var f1 = function(){
var d=v1;
console.log(d);
console.log(v1);
var v1 = '这是局部变量v1';
};
var v2 = '这是全局变量v2';
var f2 = function(){
console.log(v2);
};
var v3 = '这是全局变量v3';
var f3 = function(){
var d=v3;
var v3='这是局部变量v3';
var dd=v3;
console.log(d);
console.log(v3);
console.log(dd);
};
var v4 = '这是全局变量v4';
var f4 = function(){
var d=v4;
console.log(d);
};
</script>
f2和f4 的答案都不难得出
即分别输出window对象下的全局变量 v2和v4
原因就是函数f2和f4在建立自身的词法环境时,会先从函数体本身寻找变量,当自身找不到时,则继续遍历作用域链的上级词法环境,直到找到或者寻找对象为null为止。
而f1则输出 两个 undefined
这就涉及到了变量提升的问题了
当一个函数被建立且载入运行环境时,它会建立一个自身词法环境,该环境会预先声明自身函数体内的所以变量和函数
但在f1中变量v1的调用先于声明,故在建立词法环境时,js引擎将v1提前到调用前声明,但仅仅只是声明,并没有赋值,即v1=undefined
变量提升后的f1为:var v1 = '这是全局变量v1';
var f1 = function(){
var v1 = undefined;
var d=v1;
console.log(d);
console.log(v1);
};
f3同理,加了个dd做对比,应该更易于理解。
<script>
var v1 = '这是全局变量v1';
var f1 = function(){
var d=v1;
console.log(d);
console.log(v1);
var v1 = '这是局部变量v1';
};
var v2 = '这是全局变量v2';
var f2 = function(){
console.log(v2);
};
var v3 = '这是全局变量v3';
var f3 = function(){
var d=v3;
var v3='这是局部变量v3';
var dd=v3;
console.log(d);
console.log(v3);
console.log(dd);
};
var v4 = '这是全局变量v4';
var f4 = function(){
var d=v4;
console.log(d);
};
</script>
f2和f4 的答案都不难得出
即分别输出window对象下的全局变量 v2和v4
原因就是函数f2和f4在建立自身的词法环境时,会先从函数体本身寻找变量,当自身找不到时,则继续遍历作用域链的上级词法环境,直到找到或者寻找对象为null为止。
而f1则输出 两个 undefined
这就涉及到了变量提升的问题了
当一个函数被建立且载入运行环境时,它会建立一个自身词法环境,该环境会预先声明自身函数体内的所以变量和函数
但在f1中变量v1的调用先于声明,故在建立词法环境时,js引擎将v1提前到调用前声明,但仅仅只是声明,并没有赋值,即v1=undefined
变量提升后的f1为:var v1 = '这是全局变量v1';
var f1 = function(){
var v1 = undefined;
var d=v1;
console.log(d);
console.log(v1);
};
f3同理,加了个dd做对比,应该更易于理解。
相关文章推荐
- JavaScript的隐式声明和变量声明提升的总结
- javascript那些事儿——提升:零散变量问题
- Javascript作用域和变量提升
- JavaScript 作用域和变量提升
- 巧用局部变量提升javascript性能
- 前端开发学习三——Javascript基础,变量提升(hosting)
- JavaScript 中的执行环境、作用域(scope)以及变量提升(hoisting)
- javascript中的变量作用域以及变量提升详细介绍
- javascript中的变量作用域以及变量提升详细介绍
- 【转】巧用局部变量提升javascript性能
- JavaScript中变量提升 Hoisting
- Javascript 作用域和变量提升
- Javascript 作用域和变量提升
- Javascript 作用域和变量提升
- javascript中的变量作用域以及变量提升
- javascript中变量声明提升(Hoisting)
- 翻译 - JavaScript中的作用域与变量声明提升
- JavaScript中变量提升 Hoisting
- 深入理解Javascript作用域与变量提升
- javascript的变量声明提升