Fe-21 this&闭包

Fe-21-1 this

  • js 的一个有用但难以理解的特性 this 以及它的 3 个关联函数
    apply
    call
    bind

  • this 是运行中确定的,有什么办法确定this?

  • apply指定谁谁就是this.
    o1.hello.apply(o2)这里指定o2为this

// this 以及 3 个关联函数
// this 是在程序运行的时候才能确定的
// 谁调用了函数谁就是 this
// 仔细观察下面的例子
var greeting = function() {
    // 注意, 这个 this.name 取决于谁调用了 greeting() 函数
    console.log('Hi, ', this.name)
}
var o1 = {
    name: 'gw',
}
var o2 = {
    name: 'xc',
}
// 让 o1 o2 分别调用
o1.hello = function() {
    // 注意, 这个 this.name 取决于谁调用了 greeting() 函数
    console.log('Hi, ', this.name)
}
o2.hello = function() {
    // 注意, 这个 this.name 取决于谁调用了 greeting() 函数
    console.log('Hi, ', this.name)
}
// 调用者就是函数前面的 . 左边的对象
o1.hello()  // 调用者是 o1
o2.hello()  // 调用者是 o2
// 直接调用 greeting() 函数的话
// 调用者是全局对象
// 浏览器的全局对象是 window
// node.js 中全局对象是 global
// 所以在浏览器中直接调用 greeting() 的话, this 指的是 window
greeting()  // 调用者是 window

// apply call bind 是用来给函数指定 this 用的
// 但是用法稍有区别, 以我们长久以来使用的 log 为例
var log = function() {
    // log 是一个函数
    // js 中的函数是一个对象
    // 所以函数可以有方法
    // apply, call, bind 都是函数的方法, 用来指定 this
    //
    // apply 接受两个参数
    // 第一个参数是函数里面的 this, 这里指定了是 console,
    // 这样就相当于 console.log
    // 第二个参数是要传给函数的参数列表, 类型是 数组, apply 会把数组
    // 拆成一个个的参数传给函数
    // 假设你调用 log(1, 2, 3, 4)
    // 那么 arguments 是 [1, 2, 3, 4] 这样的一个数组
    // (实际上 arguments 不是数组, 但是表现和数组一模一样
    // 你就暂时当它是一个数组)
    // 下面这句就相当于调用 console.log(1, 2, 3, 4)
    console.log.apply(console, arguments)

    // o1.hello.apply(o2)
    // Hi,  xc
    // 如果 console.log 的 this 只能是 console
    // 那么 log 函数写成 console.log(arguments) 这样行么?

    // call 和 apply 类似, 但是小有区别, 如下
    // 第一个参数和 apply 一样
    // 第 2, 3, 4, 5, ... 个参数会依次作为参数传给函数
    console.log.call(console, 1, 2, 3, 4)
    // 上面和下面一模一样
    console.log.apply(console, [1, 2, 3, 4])
}

Fe-21-2 闭包

你可能感兴趣的:(Fe-21 this&闭包)