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