js bind()

本文解决了一个常见的JavaScript错误:非法调用TypeError。通过使用bind方法确保document.write方法在正确的上下文中执行,避免了this指向问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var s = document.write;

s("a");

这样写出后 报错

VM36:3 Uncaught TypeError: Illegal invocation

    at <anonymous>:3:1

因为s() 张样写的话 this的指向了全局 或window了 ,而页面的是dom操作,因此采用bind()方法将其在指向dom

正确的方法是 s.bind(document)('a').


03-14
### JavaScript 中 `bind` 方法的用法 在 JavaScript 中,函数是一个对象,因此可以调用其方法。`Function.prototype.bind()` 是一个用于创建新函数的方法,该新函数会将其 `this` 关键字绑定到指定的对象上[^3]。 #### 基本语法 以下是 `bind` 的基本语法: ```javascript functionName.bind(thisArg, arg1, arg2, ...); ``` - **`thisArg`**: 当绑定函数被调用时,作为 `this` 提供给目标函数的对象。 - **`arg1`, `arg2`, etc.**: 可选参数列表,在目标函数被调用时传递给它。 当通过 `bind` 创建的新函数被调用时,原始函数中的 `this` 将始终指向传入的第一个参数 `thisArg`,无论这个函数如何被调用[^4]。 #### 使用示例 ##### 示例 1: 绑定特定上下文 假设有一个对象和一个独立的函数,我们希望让此函数运行在其自己的上下文中: ```javascript const obj = { value: 42, }; function getValue() { return this.value; } // 使用 bind 来改变 this 上下文 const boundGetValue = getValue.bind(obj); console.log(boundGetValue()); // 输出: 42 [^5] ``` 在这个例子中,`getValue` 函数原本无法访问任何外部变量或属性。然而,通过 `.bind(obj)`,我们将它的执行环境设置为 `obj` 对象,从而能够返回 `obj.value`。 ##### 示例 2: 部分应用 (Partial Application) 除了更改 `this` 外,还可以预先填充一些固定参数来实现部分应用模式: ```javascript function multiply(a, b) { return a * b; } // 创建一个新的乘以二的功能版本 let double = multiply.bind(null, 2); console.log(double(5)); // 输出: 10 [^6] ``` 这里需要注意的是第一个参数设为了 `null` 或者其他无关紧要的内容,因为对于不依赖于 `this` 的场景来说并不重要。 #### 解决实际问题的例子 考虑下面这种情况:定时器内部回调丢失了外层作用域里的实例引用。利用 `bind` 则可轻松修复这个问题。 ```javascript class Timer { constructor() { this.secondsPassed = 0; } incrementAndLog() { this.secondsPassed++; console.log(this.secondsPassed); } } const timerInstance = new Timer(); setInterval(timerInstance.incrementAndLog.bind(timerInstance), 1000); // 正确做法 [^7] // 错误示范(未使用 bind) // setInterval(timerInstance.incrementAndLog, 1000); // 这样做的话每次都会报错 undefined is not an object... ``` 上述代码片段展示了如何防止因异步操作而导致的意外行为——即确保即使是在不同的环境中调用了某个方法,“this”的含义也不会发生改变。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值