this指向了解

本文深入探讨JavaScript中的this关键字,包括全局作用域、函数调用、构造函数、箭头函数、DOM事件回调、严格模式下的行为,以及call、apply和bind方法如何改变this指向。通过案例分析,详细解释了每个场景下this的指向,并展示了call、apply和bind的实际应用,帮助理解JavaScript中this的复杂性。

this指向解读:

1.函数外面的this,即全局作用域的this指向window。

2.函数里面的this总是指向直接调用者。如果没有直接调用者,隐含的调用者是window。

3.使用new调用一个函数,这个函数即为构造函数。构造函数里面的this是和实例对象沟通的桥梁,它指向实例对象。

4.箭头函数里面的this在它申明时确定,跟他当前作用域的this一样。5.DOM事件回调里面,this指向绑定事件的对象(currentTarget),而不是触发事件的对象(target)。当然这两个可以是一样的。如果回调是箭头函数,请参考上一条,this是它申明时作用域的this。

6.严格模式下,函数里面的this指向undefined,函数外面(全局作用域)的this还是指向window。

7.call和apply可以改变this,这两个方法会立即执行原方法,他们的区别是参数形式不一样。

8.bind也可以修改this,但是它不会立即执行,而是返回一个修改了this的函数。

在JavaScript中,函数内的this指向不是一成不变的,有时我们需要改变函数内的this指向.JavaScript提供了三种方法进行改变:call()、apply()、bind();

1.call()方法

call()方法使用一个指定的this值和单独给出的一个或多个参数来设置一个函数的this指向,并调用该函数.

语法:

function.call(thisArg,arg1,arg2,…,argn);

function: 被操作函数,表示将要改变this指向的被操作函数

thisArg:可选参数,表示this指向的目标对象.如果没有传递该参数,this 的值将会被绑定为全局对象(严格模式下是undefined)。

arg1,arg2,…,argn:可选参数.表示指定的参数列表(即传递给函数的实参内容)

call() 提供新的 this 值给当前调用的函数/方法。

案例:

const child={
    name:'XiaoMing',
    age:20
}

function person(name,age){
	console.log(this);
    console.log(`我的名字是${name},今年${age}岁了.`)
}

// 直接调用person函数
person('小美',18); 
/** 
	输出结果为:
                window对象
                我的名字是小美,我今年18岁了
**/

// 通过call方法设置this并调用函数
person.call(child,child.name,child.age); 
/**
	输出结果为:
				{name:'XiaoMing',age:20} // child对象
				我的名字是XiaoMing,我今年20岁了.
**/

2.apply()方法

apply()方法使用一个指定的this值和单独给出的一个数组或类似数组的参数来设置一个函数的this指向,并调用该函数.

语法:

function.apply(thisArg,argsArray)

function:指定被操作的函数对象

thisArg:可选参数,表示this最终指向的目标对象.(若不填,则this指向全局对象.严格模式下是undefined)

案例:

let child = {
        name: '小明',
        age: 18,
      };
      function person(...item) {
        console.log(this);
        console.log(item);
      }
person.apply(child, [child.name, child.age]);
/**
	输出结果为:
			{name:'小明',age:18}
			['小明',18]
**/




let list=[1,2,3];
let list2=[4,5,6];
list.push.apply(list,list2); // list.push是一个调用函数方法的形式.
console.log(list); // [1,2,3,4,5,6] 
console.log(list2); // [4,5,6
      
 /* 找出数组中最大/小的数字 */
var numbers = [5, 6, 2, 3, 7];

/* 使用Math.min/Math.max以及apply 函数时的代码 */
var max = Math.max.apply(null, numbers); /* 基本等同于 Math.max(numbers[0], ...) 或 Math.max(5, 6, ..) */
var min = Math.min.apply(null, numbers);

/* 对比:简单循环算法 */
max = -Infinity, min = +Infinity;

for (var i = 0; i < numbers.length; i++) {
  if (numbers[i] > max)
    max = numbers[i];
  if (numbers[i] < min) 
    min = numbers[i];
}

3.bind()方法(开发常用)

bind()方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

bind()方法只改变被操作对象的this指向,并不会调用函数.该方法返回一个新this指向的新函数.

语法:

function.bind(thisArg,arg1,arg2,…,argn)

thisArg:可选参数,表示新的this指向目标对象

arg1,arg2…:可选参数,表时绑定新this时传入的参数.

案例:

let child = {
        name: '小明',
        age: 18,
      };
      function person(...item) {
        console.log(this);
        console.log(item);
      }
      person.bind(child,'Hello','World')(); // bind()方法不会调用函数,需要手动调用.
   
/**
	输出结果为:
			{name:'小明',age:18}
			['Hello','World']
**/
<think>首先,用户的问题是:“我想了解普通函数中this指向 请问普通函数中this指向”。这是基于系统提供的引用内容:引用[1]、[2]和[3],这些引用解释了普通函数中this指向。 系统指令要求: - 使用中文回答。 - 所有行内数学表达式用$...$格式(但这里可能不涉及数学)。 - 独立公式用$$...$$格式(同样,这里可能不涉及)。 - LaTeX语法正确(如果需要)。 - 生成相关问题。 - 在引用段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:用户提供了引用[1]、[2]、[3]。 用户提供的引用内容: - 引用[1]:解释了普通函数中的this指向直接调用者,默认是window,严格模式是undefined,以及call/apply/bind绑定的情况。 - 引用[2]:展示了作为对象方法调用时,this指向调用对象的例子。 - 引用[3]:讨论了事件处理中this指向DOM对象。 用户上一次的问题或回答:在对话历史中,用户之前的首个问题是关于普通函数中this指向,系统给出了示例响应。现在用户再次提问相同主题,所以我需要基于提供的引用构建响应。 核心内容:用户在询问普通函数中this指向。我需要总结引用内容,确保回答全面、结构清晰。 结构化回答: 1. **引言**:简要介绍this在普通函数中的重要性。 2. **主要内容**:分场景解释this指向: - 默认调用:指向全局对象(window)。 - 在严格模式下:指向undefined。 - 作为对象方法调用:指向调用对象。 - 在事件处理中:指向DOM对象。 - 使用call/apply/bind:指向绑定的对象。 3. **使用例子**:结合引用中的例子说明。 4. **添加引用标识**:在每个相关部分自然地添加引用标识。 5. **结论**:总结关键点。 6. **生成相关问题**:在最后添加相关问题。 生成相关问题: - 基于主题,生成2-3个相关问题,如箭头函数中this的区别、常见错误等。 确保回答真实可靠:基于JavaScript标准行为,结合提供的引用。 最终响应结构: - 回答部分:清晰、逐步解释。 - 相关问题部分:以“§§相关问题§§”开头,列出问题。 使用中文:整个响应用中文。 </think>### 普通函数中this指向JavaScript中,普通函数(非箭头函数)的`this`关键字指向取决于函数的调用方式。理解`this`的指向是掌握JavaScript核心概念的关键,因为它决定了函数执行时的上下文。我将基于权威引用逐步解释常见场景,确保内容真实可靠。请注意以下几点核心规则: 1. **默认全局调用(非严格模式)**: 当普通函数被直接调用(没有绑定到特定对象)时,`this`默认指向全局对象(在浏览器中是`window`)[^1]。这在非严格模式下常见。 示例: ```javascript function test() { console.log(this); // 输出 window 对象(在浏览器环境中) } test(); // 直接调用 ``` 2. **严格模式下的调用**: 如果使用严格模式(`'use strict';`),没有直接调用者的普通函数中的`this`会指向`undefined`,避免意外污染全局作用域[^1]。 示例: ```javascript 'use strict'; function strictTest() { console.log(this); // 输出 undefined } strictTest(); // 直接调用 ``` 3. **作为对象方法调用**: 当普通函数作为对象的方法被调用时,`this`指向调用该方法的对象本身[^2]。这是面向对象编程中的常见用法。 示例(引用[2]中的代码): ```javascript const foo = { name: 'Kimi', test: function() { console.log(this.name); // 输出 'Kimi',this 指向 foo 对象 } }; foo.test(); // 调用对象方法 ``` 4. **事件处理场景**: 在DOM事件处理函数中,普通函数的`this`指向触发事件的DOM元素对象[^3]。这便于在事件回调中访问元素属性。 示例(引用[3]中的代码): ```html <button id="btn">点击</button> <script> var btnDom = document.getElementById("btn"); btnDom.onclick = function() { console.log(this); // 输出 btnDom 元素对象,this 指向按钮元素 }; </script> ``` 5. **使用call、apply或bind绑定**: 通过`call()`、`apply()`或`bind()`方法,可以显式绑定`this`到指定对象[^1]。这在需要控制上下文时非常有用。 示例: ```javascript function greet() { console.log(this.message); } const obj = { message: "Hello!" }; greet.call(obj); // 输出 "Hello!",this 被绑定到 obj const boundFunc = greet.bind(obj); boundFunc(); // 输出 "Hello!",this 被永久绑定 ``` ### 总结 普通函数中`this`的指向是动态的,取决于调用方式: - 默认指向`window`(非严格模式)或`undefined`(严格模式)。 - 作为对象方法时指向调用对象。 - 在事件处理中指向DOM元素。 - 通过`call`/`apply`/`bind`可以手动绑定。 理解这些规则能帮助你避免常见的`this`指向错误(如意外指向全局对象)。实践中,建议优先使用严格模式,并利用绑定方法控制上下文。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值