理解:当调用checkscope时,函数f被定义并作为局部变量绑定到了checkscope作用域链上,因此函数f无论在哪里调用,这种绑定依然有效,因此返回值为local scope。
var num1 = 1; function Outer(){ var num2 = 2; console.log(num1 + num2);//3 function Inner(){ //这里可以访问num3,num2,num1 var num3 = 3; console.log(num1 + num2 + num3);//6 } //这里可以访问num2,Inner(),num1但不能访问num3 Inner(); } Outer(); console.log(num1);//1,执行环境 //这里只能访问num1
作用域链(向上搜索):内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。
var name = 'Byron'; function fn(){ var name = 'Csper'; console.log(name);//Casper } fn();
越往内部的环境,变量权重越高。
注意:没有带var关键字直接声明的变量属于全局变量如直接声明a = 1,此时的a为全局变量。
javscript引擎在进入作用域时,会对代码分两轮处理。第一轮,初始化变量。第二轮,执行代码
var a = 1; function prison (a) { console.log(a);//1 var a; console.log(a);//1 } prison(1);
三、函数执行
函数调用进入执行环境时,首先处理arguments,初始化形参(默认值为undefined),然后初始化函数内的函数声明,当代码一步一步执行时再初始化函数内的变量声明(进入环境未开始执行代码时,值为undefined)。所以函数内的初始化顺序为形参,函数声明,变量声明。可以从上图图一看出。下面我来举个例子(整个全局环境也是函数)。
alert(typeof fn);//function,函数声明提前 alert(typeof fn0);//undefined,变量声明提前但未赋值 function fn(){ //函数表达式 } var fn0 = function(){ //函数定义式 } alert(typeof fn0);//function,此时变量已被赋值
您可能感兴趣的文章: