zoukankan      html  css  js  c++  java
  • 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);    //blue
    call方法能扩充函数作用域,每个函数都包含两个非继承而来的方法: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')");   //hi
    eval方法就像是一个完整的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








  • 相关阅读:
    洛谷4451 整数的lqp拆分(生成函数)
    CF1137C Museums Tour(Tarjan,强连通分量)
    CF932E Team Work(第二类斯特林数)
    CF1131F Asya And Kittens(Kruskal重构树,启发式合并)
    CF1131E String Multiplication(???)
    CF438E The Child and Binary Tree(生成函数,NTT)
    [HAOI2015]按位或(min-max容斥,FWT,FMT)
    【noi 2.6_9281】技能树(DP)
    【noi 2.6_9280】&【bzoj 1089】严格n元树(DP+高精度+重载运算符)
    【noi 2.6_9277】Logs Stacking堆木头(DP)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468961.html
Copyright © 2011-2022 走看看