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

<!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的作用域是一样的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,281评论 0 4
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,714评论 0 6
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,963评论 2 17
  • title: js面向对象date: 2017年8月17日 18:58:05updated: 2017年8月27日...
    lu900618阅读 595评论 0 2
  • 第一部分 准入训练 第1章 进入忍者世界 js开发人员通常使用js库来实现通用和可重用的功能。这些库需要简单易用,...
    如201608阅读 1,385评论 1 2