console.log(a) //ReferenceError: a is not defined console.log(a); var a=1; //undefined js中 console.l
console.log(a) //ReferenceError: a is not defined
console.log(a); var a=1; //undefined
js中 console.log(a) ;var a=1; 这样会显示undefine而不是没有定义,因为js可以把定义提前,但是不能把赋值提前。类似于函数(哪怕在js文件后部分定义,也可以在文件前部分使用)。
//补充:
Js不是可以把定义提前,而是自动已经把定义提前!因为js的函数作用域属性,整个函数都是他的。看下例:
var scope="global";
function t(){
console.log(scope); //undefined
var scope="local"
console.log(scope); //local
}
t();
这段代码等同于:
var scope="global";
function t(){
var scope; //被自动提前
console.log(scope); //不再是外部的全局变量,被内部定义的scope洗了一遍
scope="local"
console.log(scope);
}
t();
同时又有一个有趣的问题
var scope="local";
function aa(){
Console.log(scope); //local
}
这是为什么呢?因为函数里没有定义var scope 啊,scope没有被洗掉;全局变量嘛
这又是啥
var scope="local";
function aa(scope){
Console.log(scope);
}
aa(scope) //local
aa(“tt”); //tt这没啥说的,你是形参,传啥是啥,你跟全局变量重名了不起啊
那么问题又来了,这又输出啥
var scope="local";
function aa(scope){
console.log(scope); //local,等同于在函数内强制第一行var scope=外面的“local”
var scope=”aaa”;
console.log(scope); //aaa
}
aa(scope);
console.log(scope); //local变量参数传值会在函数里new一个,没你啥事
var scope="local";
function aa(scope){
console.log(scope); //local,等同于在函数内强制第一行var scope=外面的“local”
scope=”aaa”; //虽然你没加var,你想改变全局变量,但是在你
//函数作用域中已经在第一步等同于var scope了
//所以你伤不着全局变量了
console.log(scope); //aaa
}
aa(scope);
console.log(scope); //local变量参数传值会在函数里new一个,没你啥事
var scope="local";
function aa(){
console.log(scope); //local我的理解是,这里第一行没有暴力添加var scope
scope=”aaa”; //因为这里没有函数作用域,所以这个是洗了全局变量;
console.log(scope); //aaa
}
console.log(scope); //aaa 全局变量在里面成功被洗。
总体来说几个心法:
1、函数作用域(函数领域强制头行定义)。
2、变量当形参会在函数里被new一个,不影响外部。
3、函数无形参,全局变量进去不var,直接暴力改值,是改本身。