ecma2623执行环境练习

1 词法作用域

function c1(){return d1++}
function a1(){var d1=0;return c1();}
console.info(a1())
//d1 undefined c1是在a1外部定义的

//1 错误,变量对象中没找到cc
alert(cc)

//2 undefined,变量对象中找到了参数cc,但没赋值
var xx=function(cc){
alert(cc)
}()

//3 错误,变量对象把参数o=undefined
var xx=function(o){
alert(o.a)
}()

//4错误,变量对象把变量声明o=undefined
alert(o.a)
var o={}

//6 undefined,此时执行后o是对象
alert(o.a)

//7 错误 ,变量对象把变量声明o=undefined
var o;
alert(o.a)

2 作用域链问题 参数>函数声明>变量声明

//如果参数已声明,但是没有值的话,就是undefined。
//
但是如果参数没有声明,就会向上查找。

//1 undefined,在函数中,变量对象中参数a=undefined,优先使用
var a22=0;
var xx=function(a22){alert(a22)}()

//2 参数a2=undefined。b2没找到,然后往上找到了=4.
var d2=function(a2){
var a2=3,b2=4;
var c2=function(a2){
alert(a2)
alert(b2)
}()
}()

3顺序 

console.info(typeof ss3) //function
var ss3=2
function ss3(){alert("ok")}
console.info(
typeof ss3) //number

//第一个输出为function是因为这个时候下面的代码没执行,在变量对象中,函数ss先声明,类型为function,然后变量ss的声明不能覆盖函数ss。
//
第二个输出的ss是number,是因为此时下面的代码已经执行,ss被赋值=2,
//
如有不明白请看 http://www.javaeye.com/topic/812668

4 块级声明 

//ff =1 ie=2. ff中可以在块级中声明?

function f(){ alert(1)};
f();
if(1) { function f() { alert(2) } }
---------------------------------------
for(var i4=0;i4<5;i4++){if(i4=3)break}
alert(i4)
//i4是全局作用域

5 匿名函数与命名函数

//解决在块级元素中函数声明的办法,这样在ff和ie下都是first
---
var foo;
if (true) {
foo
=function() {
return 'first';
}
}
else {
foo
=function () {
return 'second';
}
}
alert(foo())


原文地址:https://www.cnblogs.com/lunalord/p/1988761.html