Js作用域、上下文

//javascript 作用域(全局、函数、eval)
var a =10;    // 全局
(function(){  //函数
  var b = 20;
})();
a;
/*
10
*/
b;
/*
Exception: ReferenceError: b is not defined
@Scratchpad/1:9:1
*/
for(var item in{a:1,b:2}){
 console.log(item);
}
console.log(item);
eval("var a=1;");
//js 没有块级作用域 也就是说 for 还有if之类的声明都是全局性的

//作用域链
function outer2(){
  var local2 =1;
  function outer1(){
    var local1 = 1;
    //这里可以范根到 局部变量local1,local2,和全局变量global3
  }
  outer1();
}
var global3= 1;
outer2();
//内部可以访问外部的变量

//利用函数作用域封装
(function(){//匿名函数
  //do sth
  var a,b;//声明局部变量 
})();
!function(){  //声明函数表达式
  //do sth
  var a,b;
}();


//ES3执行上下文Exec、变量对象(抽象概念)
/*vo按照如下顺序填充
  1、函数参数(若为传入,初始化改参数值为undefined)
  2、函数声明(若发生命名冲突,会覆盖)
  3、变量声明(初始化变量值为undefined,若发生命名冲突,会忽略)  
*/  
function foo(x,y,x){
  function x(){
    alert(x);
  }  
}
foo(100);
//console.log  使用第二条判断

function foo(x,y,z){
  function func(){};
  var func =1;
  console.log(func);
};
foo(100);
console.log(foo(100));//结果都是1 使用第三条判断
//函数表达式不会影响VO
var e=function _e(){};
//这样就可以解释 为什么变量跟 函数可以前置;而 函数表达式不可以 会报错

//函数声明 名字不可以省略 执行提前 
alert(x);//function

var x=10;
alert(x);//x=10;
x=20;

function x(){};
alert(x);//20

if(true){
  var a=1;
}else{
  var b=true;
}

alert(a);//1
alert(b);//undefined











你可能感兴趣的:(Js作用域、上下文)