困惑一:
window.color = "red";var o = {color: "blue"};function sayColor(){alert(this.color);}sayColor();//redsayColor.call(this); //redsayColor.call(window); //redsayColor.call(o); //bluecall方法能擴充函數範圍,每個函數都包含兩個非繼承而來的方法:apply()和call(),這兩個方法的用途是在特定的範圍中調用函數。
function sum(num1, num2){return num1 + num2;}function callSum1(num1, num2){return sum.apply(this, arguments);}function callSum2(num1, num2){return sum.apply(this, [num1, num2]);}alert(callSum1(10, 10));alert(callSum2(10, 10));call()方法與apply()方法的作用相同,它們的區別僅在於接收參數的方式不同。對於call()方法而言,第一個參數是this值沒有變化,變化的是其餘參數都直接傳遞參數。
困惑二:
function add10(num){return num + 10;}function getGreeting(name){return "hello" + name;}function callSomeFunction(someFunction, someArgument){return someFunction(someArgument);}var result1 = callSomeFunction(add10, 10);alert(result1); //20var result2 = callSomeFunction(getGreeting, "陽光小強");alert(result2); //"hello陽光小強"在ECMAScript中的函數名本身就是變數,所以函數也可以作為值來使用。
困惑三:
function factorial(num){if(num <= 1){return 1;}else{return num * arguments.callee(num - 1);}}alert(factorial(10));上面代碼中的arguments.callee是什麼意思?
在函數內部有兩個特殊的對象:arguments和this。argument的主要作用是儲存函數參數,但這個對象還有一個名叫callee的屬性,該屬性是一個指標,指向擁有這個arguments對象的函數。另個個特殊對象this,是函數執行的環境對象。
困惑四:
eval("alert('hi')"); //hieval方法就像是一個完整的ECMAScript解析器,它只接受一個參數,當解析器發現代碼中調用eval方法時,它會將傳入的參數當作實際的ECMAScript語句來解析,然後把執行結果插入到原位置。
ECMAScript中內建對象,由ECMAScript實現提供的,不依賴於宿主環境的對象,這些對象在ECMAScript程式執行之前就已經存在了。開發人員不必顯式的執行個體化內建對象,因為它們已經執行個體化了。如:Object、Array和String。ECMA-262還定義了兩個單體內建對象:Global和Math
ECMAScript中的Global對象在某種意義上是作為一個終極的“兜底兒對象”來定義的。換句話說,不屬於任何其他對象的屬性和方法,最終都是他的屬性和方法。事實上,沒有全域變數和全域函數;所有在全域範圍中定義的屬性和函數,都是Global對象的屬性。如:isNaN()、isFinite()、parseInt()以及parseFloat()實際上都是Global對象的方法。除此之外,Global對象還包含了其他一些方法。
1、URL編碼方法。
2、eval()方法。
ECMAScript中雖然沒有指出如何直接存取Global對象,但web瀏覽器都是將這個全域對象作為window對象的一部分加以實現的。因此,在全域範圍中聲明的所有變數和函數,就都成為了window對象的屬性。
3、Global對象還包含一些屬性如undefined、NaN以及Infinity等。
4、Web瀏覽器都是將Global對象作為window對象的一部分加以實現的。因此,在全域範圍中聲明所有變數和函數,就都成為了window對象的屬性。
var color = "red";function sayColor(){alert(window.color);}window.sayColor(); //red