javascript核心技术(四十七) 改变函数的this指向的总结 apply call bind

[复制链接]
查看: 1467|回复: 31
发表于 2023-1-28 21:34:43 | 显示全部楼层 | 阅读模式
在前面的课程中我们讲过,普通函数中this的默认指向始终为window,那么如果我们想让函数内部的this指向其它对象该怎么办呢?
JS为我们提供了以下三种方法:
1、fn.apply(obj,[arr])
它做了两件事,先改变fn函数内部的this指向,然后调用fn函数。
该方法的第一个参数为对象,是fn函数内的新this指向对象,第二个参数为数组,fn函数的形参会自动解构该数组,依次接收该数组的成员作为实参。
请看代码:
<!DOCTYPE html>
<html>
<head>
        <title>改变函数的this指向的总结 apply</title>
</head>
<body>
        <script type="text/javascript">
        function fn(m, n){
                console.log(this, m, n);
        }
        fn(3,6);//这样调用时this的指向为window
        var obj = {"age":30};
        fn.apply(obj, [8, 9]);//这样调用的this指向为obj
        </script>
</body>
</html>

javascript核心技术(四十七) 改变函数的this指向的总结 apply call bind

2、fn.call(obj,参数1,参数2,,,,,,)
<!DOCTYPE html>
<html>
<head>
        <title>改变函数的this指向的总结 call</title>
</head>
<body>
        <script type="text/javascript">
        function fn(m, n){
                console.log(this, m, n);
        }
        fn(3,6);//这样调用时this的指向为window
        var obj = {"age":30};
        fn.call(obj, 8, 9);//call同样可以改变this指向,但它不能传入数组
        </script>
</body>
</html>

javascript核心技术(四十七) 改变函数的this指向的总结 apply call bind

3、fn.bind(obj,参数1,参数2,,,,,)
<!DOCTYPE html>
<html>
<head>
        <title>改变函数的this指向的总结 bind</title>
</head>
<body>
        <script type="text/javascript">
        function fn(m, n){
                console.log(this, m, n);
        }
        fn(3,6);//这样调用时this的指向为window
        var obj = {"age":30};
        fn.bind(obj, 8, 9);//默认不调用
        fn.bind(obj, 8, 9)();//这样调用
        fn.bind(obj)(8,9);//还可以在调用时传参
        </script>
</body>
</html>

javascript核心技术(四十七) 改变函数的this指向的总结 apply call bind

以上就是对改变函数的this指向的总结,三种方法分别为apply、call和bind,它们的共同点是都可以改变this指向,不同点在于传参和调用的区别,如果仅仅是改变this指向,使用任意一种都可以。

附加案例:使用apply方法实现求数组的最大值
<!DOCTYPE html>
<html>
<head>
        <title>使用apply方法实现求数组的最大值</title>
</head>
<body>
        <script type="text/javascript">
        //加入我们已知一个数组如下:
        var arr = [3, 6, 5, 100];
        // 如果使用Math.max(3, 6, 5),它只能独立传参,所以每一个值都得从数组取出来
        // 如果使用for循环遍历判断更麻烦
        console.log( Math.max.apply(null, arr) );
        // 总结:如果已知一个数组,需要使用的方法又不允许传入数组,而是由形参独立接收实参时,我们就可以使用apply方法传入数组。
        </script>
</body>
</html>

javascript核心技术(四十七) 改变函数的this指向的总结 apply call bind


易博软件介绍
发表于 2023-2-21 17:56:08 | 显示全部楼层
^其实不光是计算机编程,其他学术方面也有同样问题,大学,中学,甚至小学教学都只是完成任务式的教育从不理会学生该怎么样,这是中国教育体制问题

0

主题

21

帖子

11

积分

营销入门

Rank: 2

积分
11
发表于 2023-3-5 15:22:32 | 显示全部楼层
呵呵,算法的问题,当然简洁明快的好!  程序也如此!  谢谢你的体会!
发表于 2023-3-16 02:02:53 | 显示全部楼层
我终于搞编程数学是多么重要,尤其是看到第三个程序,天哪,我想如果是我也会和你一样想不到的!

0

主题

10

帖子

6

积分

营销入门

Rank: 2

积分
6
发表于 2023-3-24 12:25:55 | 显示全部楼层
受益,受益。

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-4-1 03:58:27 | 显示全部楼层
不错,真的不错,很受感悟,让计算机执行更少的指令完成更多的工作,才是我所愿~

0

主题

37

帖子

20

积分

营销入门

Rank: 2

积分
20
发表于 2023-4-5 07:52:25 | 显示全部楼层
无语

0

主题

9

帖子

5

积分

营销入门

Rank: 2

积分
5
发表于 2023-4-10 16:55:22 | 显示全部楼层
收益匪浅  感触颇深  十分感谢你发的文章~~

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-4-15 07:53:45 | 显示全部楼层
感谢楼主的肺腑之言

0

主题

19

帖子

10

积分

营销入门

Rank: 2

积分
10
发表于 2023-4-20 02:57:49 | 显示全部楼层
我是新手我看不懂你的那些符号可是我在看你写的那些体验上很手感动    很好我这个人不喜欢看别人写的东西我是经过一个网上的好朋友介绍的    你写的很好可是我要是能看懂你写的那写符号就好了那就跟能体会你的    内心感觉我想和你做个朋友你想吗??想的话就在我发的帖子上留下你的    电子邮箱.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表