您现在的位置是:首页 > 文章详情

js变量提升总结

日期:2019-08-15点击:377

JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。

例1

var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();

在自运行函数内,存在var name = 'jack',所以name会提升到当前作用域最前边,所以 name为undefined。当程序运行到变量的时候,会先在当前作用域内查找该变量,如果找不到,则会向父级作用域查找,如果还是找不到,就会报错

例2

var x = 1; // Initialize x console.log(x + " " + y); // '1 undefined' var y = 2; 相当于: var x = 1; // Initialize x var y; // Declare y console.log(x + " " + y); // '1 undefined' y = 2; // Initialize y

例3

(function(){ a = 4; console.log(a); console.log(window.a); var a = 3; console.log(a); })() 输出 4 undefined 3

变量提升到当前作用域,window作用域内没有定义a,所以undefined

例4 变量与函数提升

console.log(foo); function foo(){}; var foo = '12'; console.log(foo); 输出 ƒ foo(){} 和 12; console.log(foo); var foo = function(){}; var foo = '12'; 输出 undefined

原来函数提升分为两种情况:
一种:函数申明。就是上面A,function foo(){}这种形式
另一种:函数表达式。就是上面B,var foo=function(){}这种形式
第二种形式其实就是var变量的声明定义,因此上面的B输出结果为undefined应该就能理解了。
而第一种函数申明的形式,在提升的时候,会被整个提升上去,包括函数定义的部分

例5

var sayHello; console.log(typeof (sayHey));//=>function console.log(typeof (sayHo));//=>undefined if (true) { function sayHey() { console.log("sayHey"); } sayHello = function sayHo() { console.log("sayHello"); } } else { function sayHey() { console.log("sayHey2"); } sayHello = function sayHo() { console.log("sayHello2"); } } sayHey();// => sayHey2 sayHello();// => sayHello

函数声明整体提升,js解析从上到下,提升sayHey,接着提升下面的sayHey,把第一个覆盖了,所以执行sayHey()输出sayHey2
函数表达式不会整体提升,所以输出sayHello

例6

function aa(a,b,c) { console.log(a); console.log(aa); console.log(arguments); var a = function(){ console.log(12); }; var aa = '444'; arguments = 6; console.log(a); console.log(aa); console.log(arguments); function a(){}; } aa(1,2,3); VM2311:3 ƒ a(){} VM2311:4 undefined VM2311:5 Arguments(3) [ƒ, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ] VM2311:11 ƒ (){ console.log(12); } VM2311:12 444 VM2311:13 6 undefined var num1 = 1; function fn(num3){ var num4; console.log(num1); //output undefined console.log(num3); //output 4 console.log(num4); //throw error “num4 is not defined” console.log(num2); //throw error “num2 is not defined” var num1 = num4 = 2; num2 = 3; var num3= 5; } fn(4);

例7

window.val = 1; var obj = { val: 2, dbl: function () { this.val *= 2; val *= 2; console.log(val); console.log(this.val); } }; // 说出下面的输出结果 obj.dbl(); var func = obj.dbl; func(); 2\4\8\8
原文链接:https://yq.aliyun.com/articles/714750
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章