提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
最近也是碰到一些面试题,就涉及到一些函数内部声明的变量求输出打印出什么,有极个别的特别的一点还是不是很清楚,特地研究了一下。
一、下面代码输出什么?
var a = 10;
(function () {
console.log(a); ----------------12行输出
a = 5;
console.log(window.a); ----------------14行输出
var a = 20;
console.log(window.a); ----------------16行输出
console.log(a); ----------------17行输出
})();
console.log(a); ----------------19行输出
console.log(window.a); ----------------20行输出
还请小思考一下,我一开始的错误出现在第二个打印 会认为输出打印5,结果却是。。。
以上代码结果为:
造成结果还是因为立即执行函数是一个局部作用域,var声明的会声明提前,造成里面的同一个变量为局部变量,所以在里面一切用window.打印的都为全局对象上面的对应的值
二、分析思考引出函数内部用var声明的变量和不用var声明的变量
1。立即执行函数 函数声明函数的区别
``
2。在函数内部用var声明的变量为局部变量 不用var严格来说不是为全部变量,而是看当前作用域直至顶层对象添加属性
var a = 10;
(function () {
console.log(a);
a = 5;
console.log(window.a);
console.log(a);
})();
console.log(a);
console.log(window.a);
而这上面的代码不会有这个问题,输出打印结果为:
是因为没有var在立即函数内部声明同一个变量,更不会有声明提前,但是并不是说在函数内部没用var声明的变量就是全局变量了,它并不是声明了一个全局变量,而是创建了一个全局对象的属性。Javascript的变量声明、创建属性以及每个Javascript中的每个属性都有一定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。
由于变量声明自带不可删除属性,比较var a = 10 跟 a = 5,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。