js作用域链
1. 作用域
Javascript作用域问题简单的可以用一句话来概括:两种类型的作用域( global, function)、三条作用域链。
理解两种三条前需要明白两点:
1) JavaScript是词法作用域,当一个函数被定义后,它的作用域链就作为函数的内部状态被保存了。
2) 在函数被定义时虽然作用域链确定了,但作用域链中的属性并没有确定。
两种类型的作用域:
1) 全局作用域 -- 变量为window对象的属性(默认浏览器环境中)。 <作用域链:window>
2) 函数作用域-- 变量查找的的顺序(即作用域链)< 当前call object -- .... -- window object>
特殊的一条作用域链:
通过HTML属性定义的事件处理代码:<匿名函数的call object -- 当前节点 -- 父节点--...-- window object>
--------------------------------------------------------------------------------------------------------
2. this
可 以简单概括为: "this" is a keyword not a property of any object, that refer to one object depending on the scope. In the global scope, it refers to the window object. In the function scope it refers to the object that has the function as its property.
事例说明:为什么用原始的事件注册时,事件处理函数内的this引用注册该事件的元素?
原因-- 原始事件注册实质是把事件处理程序作为该元素的一个属性(方法)。
到现在都还糊涂的一个问题:
function outer(){
function inner(){
alert( this );
}();
}
-----------------------------结果为 window -------------------------------------------------
Why "this" refer to the window object, the function inner is not the property of window.-_-
猜想: 是不是当一个函数不作为其它对象的属性时,默认this引用window?
----------------------------------------------------------------------------------------------------
10/9
通过询问Arrix,猜想正确
Js代码 ar arg = 1;
function funcTest() {
alert(arg);
var arg = 2;
}
arg = 10;
funcTest();
ar arg = 1;
function funcTest() {
alert(arg);
var arg = 2;
}
arg = 10;
funcTest();
答案是什么?如果是5年前的我,肯定不会再往下想了,还是10!这么简单的问题还用想什么呀?我的理解是这样的:funTest函数是一个无参数的函数,函数内部通过alert方法,调用外部(全局)的变量arg,在函数执行前,arg赋值为10,弹出arg值后改变arg值为2,所以弹出值为10。
真的是10吗?是还是不是?
测试的结果:弹出“undefined”,瀑布汗.
二、理解作用域链,从javas
cript运行机制说起
1、js的运行顺序
如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),它们的运行顺序是:
步骤1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)
步骤2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤5
步骤3. 对var变量和function定义做“预解析”(永远不会报错的,因为只解析正确的声明)
步骤4. 执行代码段,有错则报错(比如变量未定义)
步骤5. 如果还有下一个代码段,则读入下一个代码段,重复步骤2
步骤6. 结束
上面的分析已经足够清楚,步骤二、三和步骤四里的红色字体可能是我们新手理解上的一个盲点,尤其是步骤三的“预解析”,如果不清楚什么叫预解析,总觉得不踏实。而步骤四的“有错则报错”也是经常碰到的。举例来说:
Js代码 function funcTest() {
alert(arg);
var arg = 2;
}
funcTest();
function funcTest() {
alert(arg);
var arg = 2;
}
funcTest();
上面这段代码执行时,弹出“undefined”,也就是说arg没有定义,js的变量不是不用定义也可以吗?
2、语法分析和“预解析&rd
相关新闻>>
- 发表评论
-
- 最新评论 更多>>