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