今天敲完工作代码,遇见一个小问题。闲话少叙,我先上一段代码,再分析一下。
var nsame = "Sada";
var name = 'World!';
(function () {
console.log(typeof name === 'undefined')//true
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
(function () {
console.log(typeof nsame === 'undefined')//false
})();
同样是两个自运行函数,第一个type属性是undefined,第二个却是string。
首先来看看两个函数有什么不同
1.很简单的代码,两个函数,全局声明的变量name,nsame,都是字符串类型,问题明显不在这里。
2.函数外部原因排除,再看看内部有什么不同:
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
也只不过多出这么一段if–else–判断语句,而且其中涉及到相同的name变量的声明。先来看看我们改变内部name的使用。看下面一段代码
var nsame = "Sada";
var name = 'World!';
(function () {
console.log(typeof name)//string
if (typeof name === 'undefined') {
var names = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);//运行 Hello World!
}
})();
(function () {
console.log(typeof nsame === 'undefined')//false
})();
这时候问题消失,两者运行结果相同,都读取到了外部变量name或者是nsame。这时候我们逐渐知道了问题的关键。看下边简化问题后的代码,再进行分析。
var name = 'World!';
function ss() {
console.log(typeof name)//undefined
var name = 'Jack';
console.log('Goodbye ' + name);//Goodbye Jack
};
问题就在这里了,var 声明的作用域在整个 function 中, 但并没有初始化。也就是变量提升。
function ss () {
var name; // 变量提升,函数作用域范围内
console.log(name);
name = 'aaa';
console.log(a);
}
ss();
除此之外,还存在函数提升
console.log(f1); // function f1() {}
console.log(f2); // undefined
function f1() {}
var f2 = function() {}
总结 很简单的东西,不注意还是会被坑。祝大家好运。。。