一全局变量
是js运行的全局环境,定义全局变量其实就是在为window添加属性。定义全局变量的三种方式:
1、简单点,<script>下直接var a;
2、直接地,window.a;
3、如果没有使用var关键字来声明的话,那这个变量必须位于使用之前就赋值,也会作为全局变量添加到window对象中。代码如下:
(function() {
if (true) {
alert(h()); //不会执行成功,因为无var声明必须位于使用之前赋值
h = function() {return false;};
}
alert(h());
})();
所以,尽管平时我们定义变量可以省略var,但是易出现意想不到的情况。所以先声明后使用,好习惯!
千万要注意,不使用var不一定就是全局变量了,因为遇到的情况可能是变量声明提升
如代码:
- alert(b);
- alert("成功了!");
变量b前后都没声明,那么不会执行成功,不会弹出警告框,并且后面的语句也不会执行。但如果在调用变量之后补充了声明,那么就弹出警告,并且会顺利执行,如:
- alert(b);//返回undefined
- var b='kk';
- alert(b);//返回kk
虽然之前没有声明变量,但随后进行了声明,那么JavaScript执行器会将所有的变量声明一道语句顶部,这就是变量声明提升。
如果是在函数内声明局部变量,那么就会将变量声明提升到函数体内的最顶部,不会被当作全局变量了。千万注意以下3点:
1、如果全局变量和变量声明提升同时存在,则在变量声明提升作用域内,变量声明提升占主。如下面代码:
w=9;
function foo() {
alert(w); //undefined
var w; //undefined
alert(w);
}
foo();
alert(w); //9
2、要注意,变量声明提升的对象不要是DOM对象
- alert(event); //IE,FF,CH,OP返回undefined,而不是中断执行
3、条件语句特别注意。
代码1:
f = function() {return true;}; //函数可以这样申明,变量也可以,但必须都赋值且位于使用之前
g = function() {return false;};
(function() {
if (g() && [] !== [] ) { //除了FF,判断语句调用条件块内声明的变量或函数,也会造成变量提升,提升到与条件语句块同级。
f = function() {return false;};
function g() {return true;}
}
alert(f()); //FF:true、Other:false
alert(g()); //FF:false、other:true
})();
alert(f()); //FF:true、Other:false
alert(g()); //false
代码2:
if (!("a" in window)) { //提升到与if同级的window作用域
var a = 1;
}
alert(a); //undeinfed
代码3:
alert(typeof foo); // "undefined",函数声明也被提升了,不是当成全局变量
var foo = function () {
// body...
};
代码4:
function test() {
alert("1");
}
test();
function test() {
alert("2");
}
test();
两次都是2,所以直接使用alert好过定义相同函数。
二、this
在js中,this引用的是函数据以执行操作的对象,也就是函数在执行时所处的作用域。