首页 > 其他分享 >【面试题】说说JS中的this指向问题

【面试题】说说JS中的this指向问题

时间:2022-11-05 17:34:33浏览次数:56  
标签:面试题 console log 指向 对象 JS window 函数


JS中的this指向问题

this的指向问题

全局作用域

在JS中,全局的变量和函数附着在​​global​​​对象上,全局对象在浏览器环境下是​​window​​对象。

  • 在全局作用域中,​​this​​​指向全局对象​​window​​。
console.log(this);      // window对象
console.log(window); // window对象
console.log(this === window); // true
var a = 3;

console.log(a); // 3
console.log(window.a); // 3
console.log(this.a); // 3
console.log(a === window.a && window.a === this.a); // true
function say(){
console.log("hi");
}

this.say(); // hi

全局变量和window对象的关系

  • 使用​​var​​声明定义的全局变量被挂载到全局对象​​window​​上。
  • 使用​​let​​、​​const​​声明定义的全局变量不会被挂载到全局对象​​window​​上。

普通函数

普通函数内部的​​this​​指向调用这个函数的对象。

案例1

function testThis(){
console.log(this);
}

testThis(); // 输出结果: window对象

​testThis()​​​在全局作用域中被调用,相当于执行了​​window.testThis();​​​,则函数被调用时,内部的​​this​​​指向​​window​​.

案例2

var obj = {
test(){
console.log(this);
}
}

obj.test(); // obj

普通函数作为对象上的方法时,​​this​​指向调用方法的对象.

案例3

var obj = {
test1(){
console.log(this);
},
test2(){
test(); // 这里相当于执行了window.test();
}
}

function test(){
console.log(this);
}

obj.test1(); // obj
obj.test2(); // window
test(); // window

构造函数

构造函数一般是通过​​new​​​关键字调用的,其内部的​​this​​指向新创建的对象。

function Person(name,age){
this.name = name;
this.age = age;
console.log(this);
}

const person1 = new Person('张三',20);
const person2 = new Person('李四',18);

构造函数利用指向新对象的​​this​​​,将传入的​​name​​​和​​age​​​属性直接赋值给新对象。通过最后的​​console.log(this)​​​语句也可以检测出​​this​​的指向。


绑定事件函数

const btn = document.querySelector('button');

btn.onclick = function(){
console.log(this);
}
  • ​this​​指向触发该事件的对象。

此处,点击事件触发时,​​this​​​指向按钮这个​​DOM​​对象。


箭头函数

箭头函数没有属于自己的​​this​​​。因此,箭头函数内部使用的​​this​​​就是箭头函数所在上下文的​​this​​.

var obj = {
test1(){
console.log(this);
},
test2:()=>{
console.log(this);
}
}
obj.test1(); // obj
obj.test2(); // window

​test2​​​是箭头函数,没有属于自己的​​this​​​。在其内部输出的​​this​​​是​​obj​​​所在上下文的​​this​​​,即​​window​​。


改变this指向的方法

函数是对象,有属于自己的属性和方法。

函数有​​call​​​和​​apply​​​方法可以改变调用时​​this​​的指向。



标签:面试题,console,log,指向,对象,JS,window,函数
From: https://blog.51cto.com/u_14627797/5826036

相关文章

  • 野花--input获取焦点,改变父元素,改变兄弟元素,不使用js来实现
    :focus-within:focus-within是一个CSS伪类,表示一个元素获得焦点,或该元素的后代元素获得焦点。换句话说,元素自身或者它的某个后代匹配:focus伪类。(shadowDOM树(en-U......
  • 如何确定 this 指向?改变 this 指向的方式有哪些?
    this指向:1.全局上下文(函数外)无论是否为严格模式,均指向全局对象。注意:严格模式下全局对象为undifined2.函数上下文(函数内)默认的,指向函数的调用对象,且是最直接的调......
  • js的bind 的原理
    js的bind方法主要绑定this的指向bind方法也会返回是个bind后的函数。知道它功能我们就可以自定义bind功能letobject={name:'jeff'}functionfn(){console.log(thi......
  • CSS & JS Effect – Textarea Autoresize
    前言这是一个很普遍的体验,而且实现起来也很简单哦 参考YouTube– HowtoAutoResizeTextareausingHTMLCSS&JavaScript 效果我故意加了border和pad......
  • Jmeter断言之Json Assertion
    现在大部分的程序都是通过json格式返回数据,所以JsonAssertion也是非常重要的一个组件添加JsonAssertion组件使用方法 ......
  • JS中的变量声明
    一、引入1.定义:在JavaScript中创建变量被称为“声明”变量。JavaScript中变量声明又分为显示声明和隐式声明。其中显示声明中,被“声明”变量之前的关键词有var、let、cons......
  • 使用nvm配置nodejs,已经nodejs使用的初始化步骤
    <-----------------------------------------nvm是什么------------------------------------------------->nvm:进行node版本切换管理手动配置nvm,需要进入地址https://gi......
  • JS代码压缩
    JS代码压缩本文分享一种技术,用于实现JS代码压缩。该技术使用LZW算法。LZW算法又叫“串表压缩算法”,简而言之,通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩......
  • etherjs基本用法
    前言:直到2022.11.5才知道etherjs真正的用法,之前只用过web3.js,原来两个库是并行的,选择一个就好。 连接etherjs需要的几要素:infra_keyprivate_keyrpc_url 连接合约......
  • Node.js中的模块
    CommonJS模块CommonJS是一种规范,它定义了JavaScript在服务端运行所必备的基础能力,比如:模块化、IO、进程管理等。其中,模块化方案影响深远,其对模块的定义如下:......