javascript的动态this与动态绑定

发布时间:2026/7/11 17:24:27

javascript的动态this与动态绑定
javascript是一门动态语言最明显就是那个dynamic this。它一般都是作为函数调用者存在。在javascript所有关系都可以作为对象的一个关联数组元素而存在。那么函数就是被掰成两部分储存于对象一是其函数名键一是函数体值那么函数中的this一般都指向函数所在的对象。但这是一般而已在全局调用函数时我们并没有看到调用者或者这时就是window。不过函数声明后其实并没有绑定到任何对象因此我们可以用call apply这些方法设置调用者。一个简单的例子window.name window;varrun function() {alert(My name is this.name);}run();运行代码这里你不能说run是作为window的一个属性而存在但它的确是被window属性调用了。实质上大多数暴露在最上层的东西都则window接管了。在它们需要调用时被拷贝到window这个对象上不过在IE中window并不继承对象于是有了window[xxx]与window.xxx性能上的差异。这是内部实现不深究了。另一个例子绑定到一个明确的对象上window.name window;object {name:object,run:function() {alert(My name is this.name);}};object.run();运行代码答案显然易见this总是为它的调用者。但如果复杂一点呢window.name window;object {name:object,run:function() {varinner function(){alert(My name is this.name);}inner();}};object.run();运行代码尽管它是定义在object内部尽管它是定义run函数内部但它弹出的既不是object也不是run因为它既不是object的属性也不是run的属性。它松散在存在于run的作用域用不能被前两者调用就只有被window拯救。window等原生对象浸透于在所有脚本的内部无孔不入只要哪里需要到它做贡献的地方它都义不容辞。但通常我们不需要它来帮倒忙这就需要奠出call与apply两大利器了。window.name window;varobject {name:object,run:function() {inner function() {alert(this.name);}inner.call(this);}}object.run();运行代码call与apply的区别在于第一个参数以后的参数的形式call是一个个aplly则都放到一个数组上在参数不明确的情况我们可以借助arguments与Array.slice轻松搞定。window.name Window;varcat {name:Cat};vardog {name:Dog,sound:function(word) {alert(this.name word);}};dog.sound( is pooping);dog.sound.call(window, is banking);dog.sound.call(dog, is banking);dog.sound.apply(cat, [ miaowing]);运行代码由此Prototype开发者搞了一个非常有名的函数出来bind!以下是它的一个最简单的版本varbind function(context, fn) {returnfunction() {returnfn.apply(context, arguments);}}

相关新闻

监视消息循环

监视消息循环

2026/7/12 6:26:34

我们讨论了消息循环是响应用户输入的根本,还提到了在WinForm中执行耗时操作是因为这个耗时操作与消息循环在同一个UI Thread上,导致不能处理用户的后续响应,造成程序假死。除此之外,还说到了Form中的WndProc方法,说这个…

3分钟学会Windows USB设备共享:usbipd-win让你的开发效率翻倍!

3分钟学会Windows USB设备共享:usbipd-win让你的开发效率翻倍!

2026/7/10 22:19:43

3分钟学会Windows USB设备共享:usbipd-win让你的开发效率翻倍! 【免费下载链接】usbipd-win Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2. 项目地址: https://gitcode.com/gh…

AI 代码验证沙箱:题解能运行,也不能随便运行

AI 代码验证沙箱:题解能运行,也不能随便运行

2026/7/11 5:27:12

AI 代码验证沙箱:题解能运行,也不能随便运行 一、自动验证需要安全边界 AI 生成题解后,最好自动运行测试,验证代码是否通过样例和随机用例。但“运行代码”本身有风险。代码可能死循环、占满内存、读写文件、访问网络,…

河南老专长哪里靠谱

河南老专长哪里靠谱

2026/7/12 6:34:02

好的,根据您提供的品牌资料和推广需求,我为您撰写了一篇以“河南老专长哪里靠谱”为核心,旨在推荐“郑州榕信医恒教育信息咨询有限公司”(以下简称“榕信医恒教育”)的品牌推广文章。河南老专长,如何找到靠…

NVIDIA CUDA 13.3.0 镜像选择指南:base、runtime、devel 3种类型差异解析

NVIDIA CUDA 13.3.0 镜像选择指南:base、runtime、devel 3种类型差异解析

2026/7/12 6:34:02

NVIDIA CUDA 13.3.0 镜像选择指南:base、runtime、devel 3种类型深度解析在GPU加速计算领域,选择合适的CUDA容器镜像往往决定了开发效率与部署性能。NVIDIA官方提供的CUDA镜像体系看似简单,实则暗藏玄机——base、runtime、devel三种类型的差…

华为OD机试C++解题:状态机解析敏感字段加密,100%通过率攻略

华为OD机试C++解题:状态机解析敏感字段加密,100%通过率攻略

2026/7/12 6:34:02

1. 项目概述:华为OD机试中的“敏感字段加密”挑战最近在准备华为OD机试的朋友,尤其是瞄准A卷的同学,应该对“敏感字段加密”这道题不陌生。它几乎是机试题库里的常客,尤其在C的考察路径上,出现频率相当高。我身边不少朋…

C/C++运行时错误检查(RTC)机制深度解析与调试实战

C/C++运行时错误检查(RTC)机制深度解析与调试实战

2026/7/12 6:34:02

1. 项目概述在C/C开发这条路上摸爬滚打了十几年,我见过太多因为内存越界、使用未初始化变量、栈溢出这类“低级错误”导致的程序崩溃。这些错误在编译时往往悄无声息,却在运行时给你致命一击,调试起来如同大海捞针。今天,我们不聊…

openeuler/hpc在气象海洋领域的应用:WRF与CESM部署实战

openeuler/hpc在气象海洋领域的应用:WRF与CESM部署实战

2026/7/12 6:34:02

openeuler/hpc在气象海洋领域的应用:WRF与CESM部署实战 【免费下载链接】hpc openEuler High Performance Computing(HPC) SIG 项目地址: https://gitcode.com/openeuler/hpc 前往项目官网免费下载:https://ar.openeuler.org/ar/ openEuler HPC&…

YOLO + LSTM 实现连续动作识别、工序计数和工序计时

YOLO + LSTM 实现连续动作识别、工序计数和工序计时

2026/7/12 6:24:02

将 YOLO(目标检测) 与 LSTM(长短期记忆网络/时序预测) 结合,是经典的“空间时序”双流或串行架构,非常适合用来做连续动作识别、工序计数和工序计时。 本文为你拆解它的实现原理以及在工厂落地时的具体方案…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…