JS-2-作用域

来源:互联网 发布:软件咨询服务合同书 编辑:程序博客网 时间:2024/06/10 09:45

举例

//预处理阶段 a.b为undefined,c报错,加载的是f,d不存在,报错

alert(a);

alert(b);

alert(c);

alert(d);

var a =1

if(false){

var b = 2;

}else{

c = 3;

}

function f(){

var d = 4

}

一、定义:确定一个变量、成员、函数被访问的范围

二、块作用域,块指{}里的成员只有自己能访问,js没有块作用域

块{}

for(var i =0; i<3; i++){

}

alert(i) //3

三、函数作用域,

function f(){

var x

function g(){


}

}

四、动态作用域,,在运行时生成,js没有动态作用域

function f(){

alert(x)

}

function f1(){

var x =5;

f(); 

}

function f1(){

var x =6;

f(); 

}

f1();//报错

五、静态作用域(词法作用域或闭包)

a.js的作用域解析

b.

创建f的时候,生成隐藏成员scope,为词法环境,即f [[scope]] == lexicalEnv == window

执行的时候,创建自己的词法环境 lexicalEnv -> f.[[scope]]==window

var x = 100;

function f(){

alert(x);

}

function f1(){

var x =5;

f();

}

function f2(){

var x =6;

f()

}

f1();//输出11


作用域的继承

function f(){ //scope == window

//le{x = 100} -> f.[[scope]]


var x = 100;

function g(){ g.[[scope]] = f.le

//le ->g.[[scope]]

}

g();

}

g.le->g.[[scope]]->f.le->f.[[scope]] == window

六、创建函数的方式

function f(){}

var f = function(){}

var f = function x(argument){}

var f = new Function("","alert()")

七、new function创建函数的作用域

function f(){ //scope = window

var x = 100;

var g =function(){ //g.scope = f.le

alert(x)

}

g()

}

f(); //100


function f(){ 

var x = 100;

var g = new Function("","alert(x)") //g.[[]scope] = window

g()

}

f(); //报错,除非在外面加var  x = 100

八、作用域的本质

当在一个函数要找到一个变量中,先在本身的词法环境找,找不到,往上一层寻找,直到window对象



http://www.cnblogs.com/liu666/p/5747667.html

原创粉丝点击