JS 中的 this 和 arguments

this

在 JavaScript 中, 函数有两种调用方式:

function sum(x, y) {
    return x + y
}

// 第一种方式
sum(1, 2)    // 3

// 第二种方式
sum.call(undefined, 1, 2)    // 3
复制代码

第一种方式是常用的方法调用函数,第二种是使用 call() 方法调用函数,在使用后者调用函数时,第一个参数便是 this 值。

全局环境

无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象。

// 在浏览器中, window 对象同时也是全局对象
console.log(this === window)    // true

a = 37
console.log(window.a)    // 37

this.b = "你好"
console.log(window.b)    // "你好"
console.log(b)           // "你好"
复制代码

函数(运行内)环境

因为下面的代码不在严格模式下,且 this 的值不是由该调用设置的,所以 this 的值默认指向全局对象。

function f1(){
  return this
}
//在浏览器中:
f1() === window     //在浏览器中,全局对象是window

复制代码

然而,在严格模式下,this 将保持他进入执行环境时的值,所以下面的 this 将会默认为 undefined

function f2(){
  "use strict"    // 这里是严格模式
  return this
}

f2() === undefined    // true
复制代码

arguments

还是最上面的例子。
如果函数以 () 的方式调用,那么 arguments 就是由所有参数组成的伪数组。
如果函数以 call() 的方式调用,那么 arguments 指的就是第二个及之后的参数组成的伪数组。
需要注意的是,在非严格模式下,arguments 可以被修改。

// 非严格模式
function sum(x, y) {
    arguments[0] = 100
    arguments[1] = 100
    return x + y
}
sum(1, 2)  // 200
sum.call(undefined, 1, 2)  // 200

// 严格模式
function sum(x, y) {
    'use strict'
    arguments[0] = 100
    arguments[1] = 100
    return x + y
}
sum(1, 2)  // 3
sum.call(undefined, 1, 2)  // 3
复制代码

转载于:https://juejin.im/post/5cade284f265da03612ed122

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值