局部变量的作用域变大了,大到函数

2015-12-10  本文已影响0人  海边拾贝
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    function test() {
        //undefined escape from for{}
        alert(j);
        for (var i = 0; i < 3; i++) {
            var j = 1;
        }
        //escape from for{}
        alert(j);
    }
    //变量作用域,j可以逃出for{},但逃不出function
    //其他语言中,j连for{}都逃不出
    test();
    // not defined 直接报错
    alert(j);
</script>
</body>
</html>

普通对象:键值对的一个集合
函数对象:键值对的一个集合
可执行
带两个隐藏的属性(函数上下文\函数代码)

关于参数

arguments本身并不是JS的数组对象.虽然它有length属性,并可以用索引下标访问每个元素,但是它没有JS数组对象那么多方法(如slice concat).若想在arguments上使用JS数组对象的方法,需要借用数组的方法:
var newArgs=Array.prototype.slice.apply(arguments);
这时候返回的newArgs就是slice增强版arguments
apply()对参数对象进行增强并返回新的参数对象

第一次alert(j)这个时候js已经感知到j的定义,但j没有赋值,所以是undefined
可以认为function把所有的var声明提前到靠近function的开始位置
第二次alert(j)已经赋值了
第三次alert(j)是在function外,局部变量是逃不出function的,所以报错
其次,i和j的作用域是一样的

上一篇 下一篇

猜你喜欢

热点阅读