JavaScript你所不知道的困惑(3)
困惑一:
window.color = "red"; var o = {color: "blue"}; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.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); //20 var 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