JavaScript函数中this指向问题详解

 更新时间:2021年05月07日 09:59:24   作者:一颗不甘坠落的流星  
这篇文章主要给大家介绍了关于JavaScript函数中this指向问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

this关键字

哪个对象调用函数,函数里面的this指向哪个对象。

**严格模式下:**在全局环境中,this指向的是undefined

**非严格模式下:**在全局环境中,this指向的是window

全局定义的函数直接调用,this => window

function fn(){
	console.log(this);
	// 此时 this 指向 window
}
fn();
// 相当于 window.fn()

对象内部的函数调用,this => 调用者

var obj = {
	fn:function(){
		console.log(this);
	}
}
obj.fn();
// 此时 this 指向 obj

定时器的处理函数,this => window

setTimeout(function(){
	console.log(this);	
},0)
// 此时定时器处理函数里面的this 指向 window

事件处理函数,this => 事件源

div.onclick = function(){
	console.log(this);
}
//当你点击 div 的时候,this指向 div

自调用函数,this => window

(function () {
  console.log(this)
})()
// 此时 this 指向 window

改变 this 指向

刚才我们说过的都是函数的基本调用方式里面的 this 指向,我们还有三个方法可以忽略函数本身的 this 指向转而指向别的地方。这三个方法就是 call / apply / bind,是强行改变 this 指向的方法。

  • call/apply/bind附加在函数调用后面使用,可以忽略函数本身的 this 指向
  • call和apply使用时会立即自动调用函数,bind使用时会创建一个函数,但是需要另外去手动调用

call

语法:fn.call(fn 函数体内 this 的指向哪里,arg1, arg2, ...);

作用:调用被绑定的函数fn,指定它的 this 指向并传参

参数:

  • 第一个参数:是 this 指向
  • 其余的参数:需要传入的值,可以是多个,用逗号隔开

使用 call 方法不传参

var num = 666;

function fn() {
  console.log('num = ', this.num);
}

fn.call();  // num = 666

使用 call 方法指定this

var name = 'Rose';
var obj = {name:'Jack'};
function fn(){
	console.log(this.name);
}
fn();	// Rose
fn.call();	// Rose
fn.call(obj);  // jack

使用 call 方法指定this并传参

var name = 'Rack';
var obj = {name:'Jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.call(obj,1,2);	// obj 1 2
fn(1,3);	// window 1 3

apply

apply方法接受的是一个包含多个参数的数组

语法:fn.apply(fn 函数体内 this 的指向哪里,[arg1, arg2, ...]);

作用:调用被绑定的函数fn,指定它的 this 指向并传参

参数:

  • 第一个参数:this 指向的对象
  • 第二个参数:一个包含多个参数的数组
var obj = {name:'jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.apply(obj,[1,2]);	// obj 1 2

使用 apply 合并数组

使用push将元素追加到数组中,如果参数是数组,它会将该数组作为单个元素添加,而不是将这个数组内的每个元素添加进去,因此我们最终会得到一个数组内的数组

var arr1 = [1,2];
var arr2 = [3,4];
arr1.push(arr2);
console.log(arr1);	//	[1,2,[3,4]]	

concat虽然可以合并数组,但它并不是将元素添加到现有数组,而是创建并返回一个新数组。

var arr1 = [1,2];
var arr2 = [3,4];

var arr3 = arr1.concat(arr2);
console.log(arr1);	// [1,2]
console.log(arr3);	// [1,2,3,4]

如果我们要将元素追加到现有数组又该怎么做?循环?No!这是apply就派上用场了

var arr1 = [1,2];
var arr2 = [3,4];

arr1.push.apply(arr1,arr2);
console.log(arr1);	// [1,2,3,4]

使用 apply 与内置函数连用

/* 找出数组中最大/小的数字 */
var numbers = [5, 6, 2, 3, 7];

var max = Math.max(numbers)
var min = Math.min(numbers)
console.log(min,max);	// NaN NaN

var max = Math.max.apply(null, numbers); 
/* 基本等同于 Math.max(numbers[0], ...) 或 Math.max(5, 6, ..) */
var min = Math.min.apply(null, numbers);
console.log(min,max);	// 2 7

bind

语法:fn.bind(fn 函数体内 this 的指向, arg1, arg2, ...);

作用:创建一个新的绑定函数,指定它的 this 指向并传参,必须调用它才会被执行

参数:

  • 第一个参数:this 指向的对象
  • 其余的参数:需要传入的值,可以是多个,用逗号隔开
var obj = {name:'jack'};
function fn(a,b){
	console.log(this,a,b);
}
fn(1,2);	// window 1 2
fn.bind(obj,1,2);	// 未调用不执行
fn.bind(obj,1,3)()	// obj 1 3
var newFn = fn.bind(obj,3,4);
newFn();	// obj 1 4
newFn(5,6);	// obj 3 4

总结

到此这篇关于JavaScript函数中this指向问题的文章就介绍到这了,更多相关JavaScript函数this指向内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单谈谈JavaScript变量提升

    简单谈谈JavaScript变量提升

    对于学习JavaScript的初学者来说,变量提升是绕不过去的一个知识点,简单来说变量提升就是 JS会把var变量的声明自动提升到作用域的顶部,这篇文章主要给大家介绍了关于JavaScript变量提升的相关资料,需要的朋友可以参考下
    2021-09-09
  • javascript数组遍历的方法实例分析

    javascript数组遍历的方法实例分析

    这篇文章主要介绍了javascript数组遍历的方法,结合实例形式分析了javascript数组遍历及相关的some、every、filter、map等方法的使用技巧,需要的朋友可以参考下
    2016-09-09
  • 浅析JavaScript如何解决跨域问题并手写一个jsonp

    浅析JavaScript如何解决跨域问题并手写一个jsonp

    跨域是指浏览器为了安全性,实施的同源策略,同源策略要求,只有协议、域名和端口号完全相同的网页,才能共享资源,本文整理了一些常用的跨域解决方法,希望对大家有所帮助
    2024-03-03
  • js操作模态窗口及父子窗口间相互传值示例

    js操作模态窗口及父子窗口间相互传值示例

    这篇文章主要介绍了js操作模态窗口及父子窗口间相互传值,需要的朋友可以参考下
    2014-06-06
  • pace.js页面加载进度条插件

    pace.js页面加载进度条插件

    在页面中引入 Pace.js 和您所选择主题的 CSS 文件,就可以让你的页面拥有漂亮的加载进度和 Ajax 导航效果。不需要挂接到任何代码,自动检测进展。您可以选择颜色和多种效果,有简约,闪光灯,MAC OSX,左侧填充,顶部填充,计数器和弹跳等等。
    2015-09-09
  • javascript ES6中set集合、map集合使用方法详解与源码实例

    javascript ES6中set集合、map集合使用方法详解与源码实例

    这篇文章主要介绍了javascript ES6中set、map使用方法详解与源码实例,需要的朋友可以参考下
    2022-12-12
  • JS变量及其作用域

    JS变量及其作用域

    本文主要介绍了JS变量及其作用域的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • 浅谈javascript对象模型和function对象

    浅谈javascript对象模型和function对象

    这篇文章主要简单介绍了javascript对象模型和function对象,以及相关的示例代码,非常实用,需要的小伙伴参考下
    2014-12-12
  • 卡拉 OK 字幕效果

    卡拉 OK 字幕效果

    卡拉 OK 字幕效果...
    2006-08-08
  • JavaScript实现对下拉列表值进行排序的方法

    JavaScript实现对下拉列表值进行排序的方法

    这篇文章主要介绍了JavaScript实现对下拉列表值进行排序的方法,实例分析了javascript对下拉列表元素的遍历与排序实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论