js中作用域

本文导读:作用域是指对某一变量和方法具有访问权限的代码空间, 在JS中, 作用域是在函数中维护的。变量的作用域无非就是两种:全局变量和局部变量,js中函数内部可以直接取全局变量,在函数外部自然无法读取函数内的局部变量,在函数内部声明变量的时候,一定要使用var,如果不用的话,实际上声明了一个全局变量
 
一. 什么是作用域
 
它是指对某一变量和方法具有访问权限的代码空间, 在JS中, 作用域是在函数中维护的.
 
表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的。
 
 

二、作用域的注意事项

 

1.js的作用域是有函数划分的,而不是块儿

var too="test";

if(true){//这是在块中的定义,此时还是全局变量
var too="new test";
}
alert(too=="new test");//return true;
function test()
{
var too="old test";//这是在函数中的定义,此时是局部变量

}

test();

alert(too=="new test");//return true;too并没有改变

 

2.所有属于全局作用域的变量都是window对象的属性

上面例子中 第一行的 too就是等于 window.too

看下面的例子

function test()
{
too="test";
}
test();

alert(window.too="test");

是不是很奇怪,上面例子中函数中的too是局部变量,在这里就是全局变量了

注意下两个例子的区别,一个通过显示声明 var too

一个隐示声明too="test";

也就是说没有显示定义的变量,它就是全局变量,虽然它可能只能在这个函数内使用。

 

三、作用域实例

1、

 
JScript 代码    复制


if(true){ 
   var aa= "bb"; 
} 
console.log(aa); //bb 

for(var i = 0; i < 100; i++){ 
//do 
} 
console.log(i); //100 

 

2、

 
JScript 代码    复制


var bb = '11111'; 
function aa() { 
   alert(bb);//undefine 
   var bb = 'test'; 
   alert(bb);//test 
  var cc = "test1"; 
   alert(age);//语法错误 
} 
aa(); 

 

3、

 
JScript 代码    复制


var test = '1111111'; 
function aa() { 
   alert(test); 
} 

function bb() { 
   var test = '22222222'; 
   aa(); 
} 

bb();//alert(1111111); 

 

4、

 
JScript 代码    复制


alert(typeof aa); //function 
alert(typeof bb); //undefined 

function aa() { //函数定义式 
   alert('I am 111111111'); 
}; 
var bb = function() { //函数表达式 
} 

alert(typeof bb);//function 

 

5、

 
JScript 代码    复制


function aa(){ 
   var bb = "test"; 
   cc = "测试"; 
   alert(bb); 
} 

aa(); 
alert(cc);//测试 
alert(bb);//语法报错 

 

四、this指针作用域


在这里列出this在ECMAScript中的不同含义

(1) 在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象。

(2) 当在函数执行环境中使用this时,情况就有些复杂了。如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另 一个函数中,这个函数中的this仍然表示window对象。如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象。 (当然可以使用apply或者call函数来取代默认this的引用,详见[P88])

(3) 当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象。

 

五、作用域链

可以被看作一种路径, 沿着这条路径可以确定变量的值.

六、作用域链的特点

 

(1) var关键字决定了哪个函数是变量的作用域链的终点;
(2) 当引用一个变量时, JS会沿着由对象执行路径构成的作用域链进行解析, 查找变量最近定义的值, 一旦找到, 即使用该值.
 
七、作用域链的图例
 
js中作用域_第1张图片
 
 
 
八、作用域链实例
 
(1) function example() {
var age = 23;
}
var age = 25;
example();
alert(age); // 将输出25
 
说明: 当执行example时, 首先通过var关键字定义了一个私有变量age, 此时, example成为私有变量age作用域作用域链的终点. 在进行赋值时, 会先从作用域链的终点开始查找变量age, 由于在终点就可以找到, 所以不会继续向上查找, 故而赋值为23后, 也不会影响上一级作用域中的同名变量.
 
(2) function example() {
age = 23;
}
var age = 25;
example();
alert(age); // 将输出23
 
说明: 当执行example时, 程序准备给变量age赋值, 但程序发现example作用域内, 不存在名为age的
变量, 此时, 程序会沿着作用域链继续向上查找(即在example函数所在作用域内查找), 哟, 程序发现
了一个名为age的变量, 于是它立即拿来用, 这样age被赋值23. 而当alert函数被执行时, 它也会从它
所在的作用域开始查找变量age, 由于当它找到变量age时, 其值已被更新为23, 故而输出结果为23.

你可能感兴趣的:(js中作用域)