彩世界开奖app官网-彩世界平台官方网址(彩票平台)
做最好的网站
来自 前端技术 2019-12-07 08:16 的文章
当前位置: 彩世界开奖app官网 > 前端技术 > 正文

前端实习生面试题解析(二)【彩世界平台官方

2.call、apply、bind之间的区别

总之三种方法都是改变函数内this的指向

1.fn.call (context, arg1, arg2, .....)

call中第一个参数是fn的上下文,剩下的参数就是需要向fn中传递的参数

2.fn.apply (context, [args])

apply同call类似,第一个参数也是fn的上下文,和call不同的是,apply第二个参数是数组,call的第二个及第二个以后的参数都是数组里面的元素

3.fn.bind (context)

bind会创建一个函数,称之为绑定函数,调用这个函数时,绑定函数会以创建它是bind方法传入的第一个参数作为自己的上下文,第二个及第二个以后的参数并且加上绑定函数运行时传递进来的参数作为原函数的参数来调用原函数。 (有点绕哈,不过对下一道题有帮助)

4.call、apply、bind最大的区别就是bind不会立即调用,会返回一个函数,apply、call会立即调用。


4.解决方案

本篇是关于手写代码的题目。

1.背景介绍

3.用call或者apply实现一个bind函数

看看上面的bind定义吧,不多说了

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis || window,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

相同点:两个方法产生的作用是完全一样的

1.实现一个trim函数

关于性能的写法也不多说了,只是用最直观的写法来写一下,使用正则有大概五六种写法,感兴趣可以自己去研究下,推荐《高性能JavaScript》

1.正则实现

  • trim
       String.prototype.trim = function () {
      return this.replace(/(^s*)|(s*$)/g, "");
  }
  • leftTrim
       String.prototype.leftTrim = function () {
      return this.replace(/(^s*)/g,"");
  }
  • rightTrim
       String.prototype.rightTrim = function () {
      return this.replace(/(s*$)/g,"");
  }

2.非正则实现

  • trim
    String.prototype.trim = function () {
         var start = 0,         
             end = this.length - 1,
             ws = /s/          
        while (ws.indexOf(this.charAt(start)) > -1) {
            start   
        }
        while (end > start && ws.indexOf(this.charAt(end)) > -1) {
            end --
        }
        return this.slice(start, end   1)   
     }
  • leftTrim
    String.prototype.leftTrim = function () {
        var start = 0,          
             end = this.length - 1,
             ws = /s/          
        while (ws.indexOf(this.charAt(start)) > -1) {
             start   
        }
        return this.slice(start, end)
 }
  • rightTrim
    String.prototype.rightTrim = function () {
        var start = 0,          
             end = this.length - 1,
             ws = /s/          
        while (end > start && ws.indexOf(this.charAt(end)) > -1) {
            end --
        }
        return this.slice(start, end   1)
 }

3.混合实现

当字符串的末尾只有一小段空白时候,正则表达式会陷入疯狂工作状态;而通过循环遍历字符串的效率也比不上正则表达式,所以有了这种混合模式

    String.prototype.trim = function () {
        var str = this.replace(/^s /, '')
                end = str.length - 1
                ws = /s/
        while (ws.test(str.charAt(end))) {
            end --
        }
        return str.slice(0, end   1)
 }

2.知识剖析

maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458

1.call()方法调用具有给定this值的函数和单独提供的参数。说白了就是改变this的指向

var maxInNumbers = Math.max.apply(Math, numbers), //458

我们有一个对象whiteDog = {food:”bone”},我们不想对它重新定义say方法,那么我们可以通过call或apply用blackCat的say方法:blackCat.say.call(whiteDog);

var numbers = [5, 458 , 120 , -215 ];

alert('I love ' this.food);

6.扩展思考

见视频

7.参考文献

1.比如有段这样的函数:

var blackCat = new cat;

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。 JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。

var whiteDog = {food:'bone'};

}

blackCat.say();

参考一:【优雅代码】深入浅出 妙用Javascript中apply、call、bind

}

2.apply()方法调用具有给定this值的函数,并作为数组(或类似数组的对象)提供。

问题一:为什么要用call()和apply()方法?

问题二:call()和apply()两种方法的区别

say: function(){

3.常见问题

cat.prototype={

还有哪些和call,apply类似的方法

blackCat.say.call(whiteDog);

};

food:"fish",

获取数组中的最大值和最小值

function cat(){

bind() 方法与 apply 和 call 很相似,也是可以改变函数体内 this 的指向。 bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数,加上绑定函数运行时本身的参数,按照顺序作为原函数的参数来调用原函数。 也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。

5.编码实战

参考二:js中bind、call、apply函数的用法

call与apply的区别 call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同.

call和apply的定义

2.二者的区别

call()接受的是一个参数列表,而apply()接受一个参数数组。 func.call(this, arg1, arg2); func.apply(this, [arg1, arg2]) 其中 this 是你想指定的上下文,他可以是任何一个 JavaScript 对象(JavaScript 中一切皆对象),call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。因此要说适用条件的话,当你的参数是明确知道数量时用 call 。 而不确定的时候用 apply,然后把参数 push 进数组传递进去。

举个小栗子来区别call和apply

bind() 方法

不同点:方法传递的参数不同

本文由彩世界开奖app官网发布于前端技术,转载请注明出处:前端实习生面试题解析(二)【彩世界平台官方

关键词: IT修真院-前端 让前端飞 Web前