js作用域

来源:互联网 发布:强矩阵 编辑:程序博客网 时间:2024/06/07 15:27

//js中正常模式下只有全局作用域和函数作用域,严格模式下,还有eval作用域

//函数作用域

var scope="global";
var t=function(){
   console.log(scope);
   var scope="local"
   console.log(scope);
};
t();

var name="global";
if(true){

console.log(name);
var name="local";
}
console.log(name);

var n=1,m=2;
function add(){
console.log(n+m);
var n=3;
console.log(n+m);
}
add();

function t2(flag){
   if(flag){
       var s="ifscope";
       for(var i=0;i<2;i++) 
           ;
   }
   console.log(i);
   console.log(s);
}
t2(true);

//函数作用域的特性 : 局部变量在整个函数体始终是有定义的,我们可以将变量声明“提前”到函数体内,

//同时变量初始化还在原来位置。



//变量作用域
function t(flag){
if(flag){
s="ifscope";
for(var i=0;i<2;i++){
;
}
console.log(i);
}
}
//js中没有用var声明的变量都是全局变量,而且都是顶层对象的属性。
//当用var声明一个变量是,创建的这个属性是不可配置的,也就是说无法通过delete运算符删除
//var name=1    ->不可删除
//sex=”girl“         ->可删除
//this.age=22    ->可删除 

//作用域链
name="lwy";
function t3(){
   var name="tlwy";
   function s(){
       var name="slwy";
       console.log(name);
   }
   function ss(){
       console.log(name);
   }
   s();
   ss();
}
t3();
//作用域链都是从当前函数开始-->嵌套函数-->全局对象,不与同级别的函数有关

//当执行s时,将创建函数s的执行环境(调用对象),并将该对象置于链表开头,然后将函数t的调用对象链接在

//之后,最后是全局对象。然后从链表开头寻找变量name,很明显

//name是"slwy"。
//但执行ss()时,作用域链是: ss()->t()->window,所以name是”tlwy"

//with语句,主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部
person={name:"yhb",age:22,height:175,wife:{name:"lwy",age:21}};  
with(person.wife){  
   console.log(name);  
原创粉丝点击