美文网首页JS笔记
JSdeep(this&arguments&bi

JSdeep(this&arguments&bi

作者: 余生筑 | 来源:发表于2017-11-23 16:44 被阅读6次

call

  • 浏览器在执行点击事件时,默认点击事件函数的call参数为,引发点击事件的元素(button,div)
function f(){
      console.log(this)
      console.log(arguments)
  }
  f.call() // window
  f.call({name:'frank'}) // {name: 'frank'}, []
  f.call({name:'frank'},1) // {name: 'frank'}, [1]
  f.call({name:'frank'},1,2) // {name: 'frank'}, [1,2]

fn.call()发生了三件事

  • call stack发生了入栈
  • this被传递
  • arguments被传递

this

  • this的创造意图是让某个字段/函数与某个对象相关联
  • 在函数声明的时候我们并不知道this是谁,只知道this使该函数与某个对象相关联
  • this是fn.call()的第一个参数
    实例
var person = {
    name: 'frank',
    sayHi: function(person){
        console.log( this.name)
    }
}

person.sayHi()//等效于person.sayHi.call(person)

person.sayHi.call({name:'Lisi'})
//Lisi,注意'person.'只是用于访问到sayHi所必需的一个前缀,当call无参数时,浏览器默认person为与sayHi相关联的对象

var fn=person.sayHi
fn.call(person)//frank
fn.call()//undefined

window.name='xxx'
fn.call()//等效于fn.call(window)

call与apply

  • 当你不确定参数(arguments)的个数时,就使用 apply
function sum()
{
    var m=0
    for(var i=0;i<arguments.length;i++)
    {
        m+=arguments[i]
    }
    console.log(m)
}

var arr=[1,2,3,4.......100]

sum.call(undefined,arr[0],arr[1],arr[2].....arr[99])
//等效于sum.apply(undefined,arr)

bind与call

  • bind与call等效
this.num = 9; 
var module = {
  num: 81
};

function getNum(n,m)
{
    console.log(this.num+n+m)
}
//下列四种写法等效
getNum.call(module,1,2)//84

getNum.bind(module)(1,2)//84

getNum.bind(module).call(module,1,2)//84

getNum.bind.call(getNum,module)(1,2)//84

bind的演变史

<html lang="en">
......
<body>
        <div id="div1">123</div>
</body>
</html>
<script>
    var module={
        name:'Lier',
        age:8
    }
    var fn=function()
    {
        console.log(this.name)
    }
   /*设置点击事件*/
</script>

假如我们想给div1设置监听事件,使得点击div1后控制台打印出"Lier",该如何实现?
我们可以这样写

document.getElementById('div1').onclick=function fm()
   {
    fn.call(module)
   }

js之父不喜欢fm这个函数,于是他用bind符号制定了一个等价规则以省略fm

   fn.bind(module)=function fm()
   {
    fn.call(module)
   }

现在我们可以这么写

document.getElementById('div1').onclick=fn.bind(module)

相关文章

  • JSdeep(this&arguments&bi

    call 浏览器在执行点击事件时,默认点击事件函数的call参数为,引发点击事件的元素(button,div) f...

  • JSdeep(ajax)

    看这里碰到了疑惑时在点上面

  • JSdeep(new)

    等价于 就酱

  • JSdeep(箭头函数)

    箭头函数 箭头函数本身没有this,它的this由父级作用域传入,不能作为bind,call参数传入 因此,箭头函...

  • JSdeep(call stack)

    看这里

  • JSdeep(词法树)

    词法树只能用于检测两个变量是否为同一变量,至于值,无法检测一道面试题 解释下: 在第一种情况 this指拥有tes...

  • JSdeep(高阶函数)

    高阶函数 接受一个或多个函数作为输入: 输出一个函数: 常见高阶函数

  • this&闭包

    0.apply、call 有什么作用,什么区别 apply方法是指定this和参数的情况下调用某个函数 call方...

  • JSdeep(闹钟如何设置)

    闹钟的作用是,当他响起时, js引擎被分配到某项任务 js拿到执行该项任务所需的资源。 要达到"闹钟"的效果,有以...

  • JSdeep(柯里化)

    函数柯里化适用于这样一种场景 某一个字段,它的值来自一个数据源 当数据源变动时,该字段的值也要随之变动 有两种思路...

网友评论

    本文标题:JSdeep(this&arguments&bi

    本文链接:https://www.haomeiwen.com/subject/hanovxtx.html