zoukankan      html  css  js  c++  java
  • javascript 之Function对象的apply(),call(),bind(),方法和arguments,caller,length属性

      注:这篇文章原文:http://www.jb51.net/article/30883.htm

      自己作为学习,重新写写。

      一、写在前面的话

      前端javascript编程还只是略懂皮毛,DOM知道一点,jquey会用一点点,深知夯实基础,了解前端的系统的知识对于web开发(自己主要做的是PHP后台的开发)的重要。固然,要用什么,就查什么(现学现卖)很合理,但对于长远来讲,只是在隔靴捎痒,很难有实际的作为。

      故,痛定思痛,应该对web前端,尤其是 javascript开发(过程式-->面向对象-->各种javascript库、jquery,即javascript框架、Anjular)这些东西都应该有一些全面系统、慢慢深入的了解。只有全面系统了解了,深入进去了,才不会老是临时才报佛脚,才能自己主动去发现问题,自己主动去提高,开拓眼界。

       二、javascript 的Function对象

    官方API 文档(IE microsoft):https://msdn.microsoft.com/zh-cn/library/x844tc74(v=vs.94).aspx

    由于Function对象的属性和方法,我们自定义的函数都会自动有这些属性和方法,具体用的时候查看API,IE、FireFox、Chrome可能不同。

    主要讲讲apply(),call():

    1、apply(),call()用途相同,都是在特定的作用域中调用函数。++call和apply方法通常被用来实现类似继承一样的功能,以达到代码复用的功效。它们的区别主要体现在参数上。

    2、接受参数方面,apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
    call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。  

    例1:

    window.firstName = "diz"; 
    window.lastName = "song"; 
    var myObject = { firstName: "my", lastName: "Object" }; 
    function HelloName() { 
      console.log("Hello " + this.firstName + " " + this.lastName, " glad to meet you!"); 
    } 
    HelloName.call(window); //huo .call(this); 
    HelloName.call(myObject); 
    

      运行结果为:
    Hello diz song glad to meet you!
    Hello my Object glad to meet you! 

    例2:带参数

    function sum(num1, num2) { 
    return num1 + num2; 
    } 
    console.log(sum.call(window, 10, 10)); //20 
    console.log(sum.apply(window,[10,20])); //30 
    

      分析:通过例1发现,apply()和call()的真正用武之地是能够扩充函数赖以生存的作用域,如果我们想要用传统的方法实现,代码如下:

    window.firstName = "diz"; 
    window.lastName = "song"; 
    var myObject = { firstName: "my", lastName: "Object" }; 
    function HelloName() { 
    console.log("Hello " + this.firstName + " " + this.lastName, " glad to meet you!"); 
    } 
    HelloName(); //Hello diz song glad to meet you! 
    myObject.HelloName = HelloName; 
    myObject.HelloName(); //Hello my Object glad to meet you! 
    

      我们发现,要想让HelloName()函数的作用域在对象myObject上,我们需要动态的创建 myObject的 HelloName属性,此属性作为 指针 指向 HelloName()函数,这样,我们调用 myObject.HelloName()时,函数内部的this变量就指向 myObject,也就可以调用该对象内部的其他公共属性了。

      分析例2,我们可以看到call()和apply()函数的真正运用之处,在实际项目中,还需要根据实际灵活加以处理!
      一个小问题:再看一看函数中定义函数时,this变量的情况

    function temp1() { 
    console.log(this); //Object {} 
    function temp2() { 
    console.log(this); //Window 
    } 
    temp2(); 
    } 
    var Obj = {}; 
    temp1.call(Obj); //运行结果见上面绿色的注释!!!! 
    

      执行结果与下面的相同

    function temp1() { 
    console.log(this); 
    temp2(); 
    } 
    function temp2() { 
    console.log(this); 
    } 
    var Obj = {}; 
    temp1.call(Obj); 
    

    例3:

    再看一个例子:

    //定义一个Animal类
    function Animal(){ this.name = "Animal"; this.showName = function(){ alert(this.name); } } /**定义一个Cat类*/ function Cat(){ this.name = "Cat"; } /**创建两个类对象*/ var animal = new Animal(); var cat = new Cat(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给当前对象cat来使用了。 //输入结果为"Cat" animal.showName.call(cat,","); //animal.showName.apply(cat,[]);

        

    3、bind()方法

    支持此方法的浏览器有IE9+、Firefox4+、Safari5.1+、Opera12+、Chrome。它是属于ECMAScript5的方法。直接看例子:

    window.color = "red"; 
    var o = { color: "blue" }; 
    function sayColor(){ 
    alert(this.color); 
    } 
    var OSayColor = sayColor.bind(o); 
    OSayColor(); //blue 
    

      这里,sayColor()调用bind()方法,并传入o对象,返回了OSayColor()函数,在OSayColor()中,this的值就为o对象。 

  • 相关阅读:
    for循环里面不要进行remove操作,for循环里remove元素后,list的下标会减小,导致遍历不完全
    elasticsearch,java api, transport Client, 查询时索引库可以用通配符*和删除接口不能用
    (一)WebPack4.0 从零开始
    合并代码 dev 到 master
    vscode 终端无法输入问题 看这个就行了
    node 学习笔记:一、 nvm 安装管理Node版本
    常见的对象创建模式
    深入理解闭包
    sort对数组排序
    图片压缩
  • 原文地址:https://www.cnblogs.com/oxspirt/p/4284288.html
Copyright © 2011-2022 走看看