深入理解JS基础(2)

52 阅读1分钟

1. 参数按值传递

ES中所有函数的参数都是按值传递的,按值传递就是函数外部的值复制给函数的参数

var value = 1
function foo(v){
    v = 2
    console.log(value)
}
foo(value)
console.log(value)

打印 2 1

手写 call、apply

call的用法

let obj = {
    name: "张三"
}
function bar(age,sex){
    console.log(this.name+'今年'+age+'岁'+',是个'+sex)
}
bar.call(obj,18,'男')

因为this指向函数的调用者,call就是在执行函数时,将其调用者设定为call中的第一个参数。并且能够传递多个参数。

知道其功能后开始实现call:

Function.prototype.mycall = function(context){
    var context = context || window
    context.fn = this
    let arg = [...arguments].slice(1)
    context.fn(...arg)
    delete context.fn
}

apply与calld的区别是apply只能传入2个参数,第一个仍然是绑定对象,第二个是参数

Function.prototype.myApply = function (context, arr){
    var context = context || window
    context.fn = this
    context.fn(...arr)
    delete context.fn
}

手写bind

bind的用法,会创建一个新的函数,当新函数被调用时,bind第一个参数this

  1. 返回一个函数
  2. 能传入参数,并且参数可以分两次传入
var foo = {
    name: 1
}
function bar(age,job){
    console.log(`${this.value},${age},${job}`)
}
bar.bind(foo,18)("前端开发工程师")
    Function.prototype.mybind = function(context){
        let _this = this
        let args1 = [...arguments].slice(1)
        return function(){
            var args2 = [...arguments] 
            return _this.apply(context,[...args1,...args2])
        }
    }