函数作用域
在javaScript中是没有块级作用域的,代替的是函数作用域,这个与传统的java语言和我熟悉的actionScript是不同的。
function test(o){
if(typeof o == "object"){
var j = 1;
for(var k=0; k<10; k++){
console.log(k);
}
console.log(k); // 10
}
console.log(j); // 1
}
test({key:1});
传统的块级作用域,当声明变量k,那么k在for循环中是有效的,离开for循环是没有定义的,但是在javaScript中,输出了10,证明k无论在函数体内部任何位置声明,都是可以保存记录的。
变量声明提前
在javaScript中,在一个函数内部的内部变量,无论在函数内部哪里声明,都会立刻生效,影响了整体函数的内部变量。当然这回带来困扰,让代码产生歧义,最好的做法是在函数内部开始处进行声明,避免与全局变量的冲突,因为在函数内部,内部变量是优先执行的,忽略全局变量。
var scope = "global";
function f(){
console.log(scope); // undefined
var scope = "local";
console.log(scope); // local
}
f();
上面的例子说明内部变量取代全局变量,并且变量声明提前,对阅读代码和程序执行造成了困扰。
var scope = "global";
function f(){
console.log(scope); // global
}
f();
内部变量不声明,全局变量被引用,正确输出引用的定义。
通过学习javaScript最大的感受就是要理解并记住与传统语言的编程运行差异,当然传统语言更好的编程习惯将保证你的代码更健壮,但是了解差异将帮助你更深入的理解javaScript并写出更好的前端代码。