javascript 函数绑定到什么对象(它的“this”是什么)?

2024-04-10

我知道它在函数内部this.

var func = function {
    return this.f === arguments.callee; 
    // => true, if bound to some object
    // => false, if is bound to null, because this.f === undefined
}

var f = func; // not bound to anything;

var obj = {};
obj1.f = func; // bound to obj1 if called as obj1.f(), but not bound if called as func()

var bound = f.bind(obj2) // bound to obj2 if called as obj2.f() or as bound()

Edited:

你实际上不能打电话obj2.f() as f不会成为...的财产obj2

编辑结束。

问题是:如何在该函数之外找到该函数绑定的对象?

我想实现这个目标:

function g(f) {
  if (typeof(f) !== 'function') throw 'error: f should be function';

  if (f.boundto() === obj)
    // this code will run if g(obj1.f) was called
    doSomething(f);

  // ....

  if (f.boundto() === obj2)
    // this code will run if g(obj2.f) or g(bound) was called
    doSomethingElse(f);
}

和部分应用而不更改函数绑定到的对象:

function partial(f) {
   return f.bind(f.boundto(), arguments.slice(1));
}

共识:

你做不到。要点:使用bind and this非常小心:)


部分申请

您可以进行部分应用:

// This lets us call the slice method as a function
// on an array-like object.
var slice = Function.prototype.call.bind(Array.prototype.slice);

function partial(f/*, ...args */) {

    if (typeof f != 'function')
        throw new TypeError('Function expected');

    var args = slice(arguments, 1);

    return function(/* ...moreArgs */) {
        return f.apply(this, args.concat(slice(arguments)));
    };

}

该函数绑定到什么对象?

此外,对于你的问题的第一部分有一个非常直接的解决方案。不确定这是否适合您,但您可以很容易地在 JS 中进行猴子修补。猴子补丁bind是完全有可能的。

var _bind = Function.prototype.apply.bind(Function.prototype.bind);
Object.defineProperty(Function.prototype, 'bind', {
    value: function(obj) {
        var boundFunction = _bind(this, arguments);
        boundFunction.boundObject = obj;
        return boundFunction;
    }
});

只需在任何其他脚本运行之前运行它,以及任何使用的脚本bind,它会自动添加一个boundObject函数的属性:

function f() { }
var o = { };
var g = f.bind(o);
g.boundObject === o; // true

(注意:我假设您处于上述 ES5 环境中,因为您正在使用bind.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript 函数绑定到什么对象(它的“this”是什么)? 的相关文章

  • 模板类中的模板函数 is_same

    为什么这段代码会产生错误的输出 this type cpp include
  • 如何按日期属性对对象数组进行排序?

    假设我有一个由几个对象组成的数组 var array id 1 date Mar 12 2012 10 00 00 AM id 2 date Mar 8 2012 08 00 00 AM 如何按日期元素从最接近当前日期和时间的日期开始对该数
  • nodeJS require.paths 解决问题

    我试图相对且神秘地需要一个文件 以下情况正在发生 这很有效 这表明 Users marcos Desktop Taper lib utils js myPath Users marcos Desktop Taper lib utils re
  • 使用 Geoserver 中的 Javascript 动态设置 WMS 图层样式

    我的 Web 应用程序通过 Geoserver 2 6 0 从 Postgis 向 OpenLayers 地图提供 WMS 图层 工作正常且符合预期 用户可以通过 WMS 图层的属性 通过 HTML 中的下拉框 过滤 WMS 图层的某些元素
  • 如何防止脚本注入攻击

    Intro 这个话题一直是 StackOverflow 以及许多其他技术论坛上许多问题和答案的祸根 然而 其中大多数都是特定于具体条件的 甚至更糟 通过脚本注入预防中的 整体 安全性dev tools console or dev tool
  • 在没有事件的情况下从 HTML 执行 javascript 函数

    我希望从 HTML 页面调用 javascript 函数 并且我do not希望它依赖于任何事件 该函数位于单独的 js 文件中 因为我希望在许多网页中使用它 我也将变量传递给它 我试过这个 HTML fp footer2 js中的函数 f
  • 禁用 Chrome 的文本输入撤消/重做 (CTRL+Z / CTRL+Y)

    i m currently developing a web application and i encounter a problem As you might know or not chrome has a feature that
  • 如何从 OnChange 事件捕获文本框的值

    在我的 C MVC 应用程序中 我有一系列这样生成的文本框 foreach object item in items Html TextBox 渲染的结果是一系列看起来像这样的文本框
  • D3js 多折线图 mouseOver

    我正在努力适应this http bl ocks org mbostock 3902569D3js 折线图示例 将鼠标悬停在我的多线图表上的使用情况 看起来d3 mouse this 0 on the mousemove函数生成以下错误 无
  • Raphael JS 中的动画字体大小是否有流畅的过渡可能性?

    到目前为止似乎它不流畅 但波涛汹涌 例如 如果您有一个 font size 14 的状态属性 并且想要以动画方式显示 font size 16 的状态 则过渡看起来并不平滑 它分两步跳跃 首先更改为 15 然后更改为 16px 可以强迫它看
  • 使用 var 与 let/const 进行块级变量重新声明

    Part 1 给出这个例子 var number 10 var number 42 console log number 42 为什么第 4 行不抛出Uncaught SyntaxError Identifier number has al
  • 从网站保存嵌入的 pdf

    我正在编写一个小型 C 应用程序来管理供应商提供的 化学品 安全数据表 目前 我手动搜索该化学品并保存 pdf 并在我的程序中添加指向 pdf 的链接 问题是我还有很多化学品需要处理 所以最好将过程自动化 例如 化学品的部件号如下 2710
  • 避免使用 Grunt cssmin 任务来删除重复条目

    在我的 Gruntfile 中 我使用 cssmin grunt contrib cssmin 任务 就像是 cssmin css src dist styles css dest dist styles min css 问题是 style
  • Socket.io 不断重复连接并忽略其他事件

    我正在尝试制作一个网络应用程序 用户可以在其中互相玩环形国际象棋 这是我的 app js 在服务器上 var express require express var app express var http require http Ser
  • 检测 Service Worker 离线状态的最佳实践

    我有一个服务工作者应该缓存一个offline html客户端没有网络连接时显示的页面 然而 有时它会认为导航器已离线 即使它并未离线 那是 navigator onLine false 这意味着用户可能会得到offline html而不是实
  • JavaScript 类继承

    谁能告诉我为什么我的 showDiv boo 在类的方法中未定义 我也无法访问我的类的方法 这是我的 Blink 类及其属性和方法 function Blink div this div div Blink prototype counte
  • 无法定义 set 和 get 方法

    尝试使用访问器定义属性时出现错误 这是我的代码 var person Object defineProperty person birthYear value 1997 writable true enumerable true confi
  • 从 BLOB 打印 PDF

    我从外部 API 获取 PDF 文件 使用此代码我可以正确下载该文件 var req new XMLHttpRequest req open POST url true req responseType blob req setReques
  • MutationObserver 不适合儿童

    提前为可能是一个简单的问题和下面令人震惊的 javascript 道歉 我的问题如下 网站上有一个横幅 每隔几秒钟就会显示四个图像 我正在尝试将 印象 推入数据层以供 GTM 拾取 为了显示下一个图像 我们 不是我自己 将下一个横幅图像的
  • 类型错误: jasmine.getEnv().currentSpec 为 null

    当我尝试运行我的茉莉花规格时 我得到 TypeError jasmine getEnv currentSpec is null in http localhost 8888 JASMINE ROOT jasmine js line 498

随机推荐

  • Python、paramiko、invoke_shell 和丑陋的字符

    当我运行下面的 Python 代码时 import workflow import console import paramiko import time strComputer server com strUser user strPwd
  • 在 Python 3.6 中将 ABCMeta 与 __init_subclass__ 组合时出现类型错误

    我正在尝试使用 python 3 6 的新功能 init subclass 特征 PEP 487 https www python org dev peps pep 0487 与abc模块 它似乎不起作用 以下代码 from abc imp
  • 应用程序传输安全已阻止明文 HTTP 资源

    我在 swift 中使用 Socket IO 库 但不断收到此错误 应用程序传输安全已阻止明文 HTTP http 资源 加载 因为它不安全 可以通过以下方式配置临时例外 您应用程序的 Info plist 文件 当我尝试发送 http 请
  • 我想为 Linux 内核做出贡献 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Kotlin when() 局部变量介绍

    假设我有一个昂贵的函数 名为doHardThings 它可能返回各种不同的类型 我想根据返回的类型采取行动 在 Scala 中 这是一个常见的用法match构造 def hardThings doHardThings match case
  • 使用 Vue.js 确定放置坐标是否位于另一个元素上方?

    我正在使用vue 可拖动 可调整大小 https github com mauricius vue draggable resizable组件将给出 x y 偏移坐标 说明我的元素在页面上的放置位置 一切都很好 但是 我想知道是否有办法确定
  • 如果我在函数中导入模块,变量是局部变量吗?

    如果我在函数 本地范围 内导入 python 3 中的模块 导入的内容是否是该函数的本地内容 Like def test import math s math cos 1 s math cos 1 是的 该模块将是该函数的本地模块 至少在上
  • 哪个元素导致水平滚动条?自动检测[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 隐藏或删除导航栏按钮项目中的特定项目,Swift 4

    从导航栏中隐藏或删除特定按钮项目UIBarButtonItem这是从故事板给出的 例如右侧导航栏项目我添加了 3UIBarButtonItem就像情节提要中的 完成 取消 下一步 现在我想根据用户登录以编程方式从导航栏中删除或隐藏 取消 按
  • ADT插件会自动创建ant构建文件吗?

    几个月前我创建了一个 Android 项目 现在必须使用 Hudson 自动化构建过程 Android 开发指南提到了一个 build xml 文件 该文件在生成项目时创建 http developer android com guide
  • 多语言 PHP 应用程序:最佳实践?

    我想获得您对我在 PHP MVC Web 应用程序上实现多语言支持的方式的反馈 我就是这样做的 在 app 文件夹中 我创建了一个 linguals 文件夹 其中包含每种语言一个文件 english php spanish php 等 每个
  • .htaccess 将子域重写到目录

    是否可以使用 htaccess将子域重写为目录 Example http sub domain example 显示内容 http domain example subdomains sub 尝试将其放入您的 htaccess file R
  • 服务和活动之间沟通的最佳方式是什么?

    现在 Activity 可以使用以下三种方式之一连接到服务 广播接收器 http developer android com reference android content BroadcastReceiver html 信使 http
  • FAILED 错误:java.io.IOException:所有收集器的初始化失败

    我在运行 MapReduce WordCount 作业时遇到一些错误 错误 java io IOException 所有收集器的初始化 失败的 最后一个收集器中的错误是 class wordcount wordmapper at org a
  • Webpack - extract-text-webpack-plugin 找不到模块

    webpack config js var ExtractTextPlugin require extract text webpack plugin 如果我刚刚实现该插件 我会立即收到此错误 module js 339 throw err
  • URLLoader 数据到 BitmapData

    我正在尝试加载 SWF 文件旁边的图像文件 像这样的东西 var loader URLLoader new URLLoader loader dataFormat URLLoaderDataFormat BINARY loader addE
  • MVC 与前端控制器混淆

    简化问题 我正在学习 oop 模式 并且希望构建自己的简单 mvc 框架 我希望它有一个前端控制器 但我发现很难找到任何可靠的信息来使用 MVC 实现前端控制器 特别是我很困惑前端控制器是否应该启动整个三元组 或者前端控制器是否只是简单地调
  • SKScene 中的 Segue 到 UIViewController

    在我的 GameScene swift 文件中 我尝试执行返回到我的菜单视图控制器的操作 如下所示 func returnToMainMenu var vc UIViewController UIViewController vc self
  • MySQL CASE 是如何工作的?

    我知道 SQL 的CASE语法如下 CASE WHEN search condition THEN statement list WHEN search condition THEN statement list ELSE statemen
  • javascript 函数绑定到什么对象(它的“this”是什么)?

    我知道它在函数内部this var func function return this f arguments callee gt true if bound to some object gt false if is bound to n