MST

星途 面试题库

面试题:JavaScript严格模式下复杂场景中this的行为及优化

假设有一个JavaScript类库,其中有一系列复杂的函数嵌套和对象方法调用。在严格模式下,某些函数内部的`this`指向出现异常,导致功能无法正常实现。请描述可能导致`this`指向异常的原因,并给出至少两种优化方案来确保`this`指向正确,同时保证代码的可维护性和性能。(可以通过示例代码辅助说明)
42.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

可能导致this指向异常的原因

  1. 函数调用方式:在严格模式下,函数作为普通函数调用时,this不再指向全局对象window(非严格模式下指向window),而是undefined。例如:
function test() {
    'use strict';
    console.log(this); // undefined
}
test();
  1. 箭头函数:箭头函数没有自己的this,它的this取决于外层(函数或全局)作用域的this。如果在复杂嵌套中使用不当,可能导致this指向并非预期。例如:
function outer() {
    'use strict';
    this.value = 10;
    const inner = () => {
        console.log(this.value); // 这里的this指向outer函数的this
    };
    inner();
}
new outer();
  1. 事件处理函数:当将一个函数作为事件处理函数绑定,在严格模式下,this通常指向触发事件的DOM元素,若在函数内部有对this的其他期望指向,就会出现异常。例如:
<button id="btn">Click me</button>
<script>
    'use strict';
    const obj = {
        value: 20,
        handleClick: function() {
            console.log(this.value); // 期望this指向obj,但实际指向按钮元素,会是undefined
        }
    };
    document.getElementById('btn').addEventListener('click', obj.handleClick);
</script>

优化方案

  1. 使用bind方法bind方法可以创建一个新函数,在这个新函数中,this被绑定到指定的值。例如:
function outer() {
    'use strict';
    this.value = 10;
    function inner() {
        console.log(this.value);
    }
    const boundInner = inner.bind(this);
    boundInner();
}
new outer();
  1. 使用箭头函数替代普通函数(注意外层this的正确指向):如上述第二个示例,利用箭头函数捕获外层this的特性。
function outer() {
    'use strict';
    this.value = 10;
    const inner = () => {
        console.log(this.value);
    };
    inner();
}
new outer();
  1. 使用callapply方法:在调用函数时,通过callapply明确指定this的指向。例如:
function outer() {
    'use strict';
    this.value = 10;
    function inner() {
        console.log(this.value);
    }
    inner.call(this);
}
new outer();