函数this

Arguments是个类似数组但不是数组的对象,说他类似数组是因为其具备数组相同的访问性质及方式,能够由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际 传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。

arguments是个类数组结构,它存储了函数在调用时传入的所有实参, 通过访问它的length属性可以得到其中保存的实参的个数,并可以通过arguments[n]按顺序取出传入的每个参数(n=1,2,…,arguments.length-1)。

function fn(arg1, arg2){    // 'use strict';
    arguments[1]="1"
    console.log(arguments);   
     console.log(arg2);//2

console.log(arg1 === arguments[0]); // true
console.log(arg2 === arguments[1]); // false
console.log(arg3 === arguments[2]); // true
}
fn(1,2,3,4,5); // 调用
// length是获取形参个数 
console.log(fn.length);//2

【函数 this 的指向】
在非严格模式下而且是浏览器环境下,函数的 this 指向 window;
而在严格模式下, this 的值是 undefined。

// 非严格模式
function fn(){console.log(this);}
fn(); // global || Window
//严格模式
'use strict';
function fn(){console.log(this);}
fn(); // undefined

.当函数被一个对象当成方法调用时, 这个函数的 this 会指向调用它的对象;

// 定义一个对象
let wz = {
    getThis (){ // 定义一个函数
    return this; // 这个函数返回自己的 this 指向
    }
}
let wzthis = wz.getThis(); // 通过对象调用函数得到函数的 this 指向
console.log(wzthis === xm); // true, 函数的this指向调用它的对象本身

函数的call() 和 apply()

let wz = {
name: '王者',
sayName(){console.log(this.name);}
};
wz.sayName(); // 对象调用函数输出 '王者'
let xg = {name: '峡谷'};

对象 xh 只有 name 属性, 没有 sayName 属性, 如果想让 xh 也使用 sayName 函数来输出自己的名字, 那么就要在调用 sayName 时让它的 this 指向小红, 以达到 this.name 等于 xh.name 的目的。 这个目的就可以通过 call 和 apply 两个函数来实现。 以call 函数为例来实现这个需求, 只需要这样写就可以了:

wz.sayName.call(xg); // 峡谷
xm.sayName.apply(xg); // 峡谷

call 和 apply 的区别:
call 和 apply 的区别仅仅是要传给fn的参数的形式不同:对于apply,传给fn的参数argument是个数组,数组由所有参数组成;对于call,传给fn的参数argument直接是所有参数的排列, 直接一个个写入就可以。

箭头函数的this指向是继承而来的,并且指向在定义它时所处的对象,即父级作用域,而不是执行时的对象。这意味着箭头函数内部的this的值不会受到函数调用方式的影响,而是固定指向外层代码块的this。这种特性让箭头函数在使用setTimeout、setInterval等场景下更加方便地使用this。所以,无论箭头函数在哪里被调用,它的this都指向定义它的外层代码块的this,而不是调用时的对象。这与传统的函数的运行机制不同,传统的函数中的this是动态绑定的,它的值会根据函数的调用方式来决定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [箭头函数this的指向](https://blog.csdn.net/weixin_57959921/article/details/129439200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [关于箭头函数中的this的指向](https://blog.csdn.net/xu4321083/article/details/79753800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [箭头函数及其this的指向](https://blog.csdn.net/qq_53841687/article/details/125770647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值