函数this指向

本文深入探讨JavaScript中this关键字的指向规则,特别是在不同上下文中调用函数时的行为。通过具体示例,解释了this如何根据函数的调用方式指向不同的对象,包括对象内部、作为普通函数调用以及在全局作用域中的表现。
var o={
  a:10,
  b:{
    a:12,
    fn:function () {
      console.log(this.a);//12
    }
  }
};
o.b.fn();//调用对象

我们都知道函数this的指向是调用它的对象(就近的对象)

对象 b 里面有 a 这个属性。那么当我们调用对象属性 a 的值是12而不是10;那么这个this的指向就是 b 这个对象,而不是o这个对象---------------注意点  this指向最后调用它的对象。

 

  var o={
      a:10,
      b:{
        //a:12,
        fn:function () {
          console.log(this.a);//undefined
        }
      }
    };
    o.b.fn();//调用对象

 

当我们注释掉 b 里面 a 的值会发现this.a的值是undefined?

因为js是一门动态类型的语言,当我们我们对象点(.)一个属性的时候那么这个属性就有了,如果没有赋值就是undefined。

通过上面我们知道不管对象里面有没有属性a,这个this的指向也是对象 b 因为this总是指向它上一级的调用它的对象。

 

看重点:重要重要重要

var a = 5;
var o = {
  a: 10,
  b: {
    a: 12,
    fn: function () {
      console.log(this.a);//5
    }
  }
};
var j = o.b.fn;//把函数fn赋值给变量j
j();//调用函数fn

这里的属性 a 的值是5,而不是10和12,并且this的指向是window对象。为什么?

你没有理解一句话,这句话非常最重要。this的指向是最后调用它的对象,就是看它执行的时候是谁在调用,在当前例子里面虽然fn函数是被对象 b 所引用但并没有调用,而是把引用的函数fn给了全局变量 j 。然后 j 去调用了函数所以this的指向是window,那么 a 的值为什么是5的原因了。

扩展一下

函数调用:函数名();--------函数名+()

本人小白学习 javascript 与 php 请大家多多关注有更多的本人学习的心得分享出来 ! 大家多多支持

<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`指向错误(如意外指向全局对象)。实践中,建议优先使用严格模式,并利用绑定方法控制上下文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值