匿名函数的上下文是什么?

2024-02-11

我有这样的代码:

function demo() {
    this.val=5;
    function() {
        this.val=7;
    }();
}

现在,当我在 Firefox 或 Chrome 控制台中执行此代码时,它会出现语法错误。我不明白为什么这是一个错误,因为我读过 javascript 函数是对象,所以当我调用匿名函数时,在它内部this指向功能演示,应该更改val to 7,所以如果我这样做

var x=new demo();
x.val;   //should give 7

但当我这样做时

function demo() {
    this.val=5;
    var f=function() {
            this.val=7;
    }();
}
window.val;    // gives 7

我不明白如果函数是对象那么为什么this在匿名函数中指向window并不是demo。 请解释一下。


我不明白为什么这是一个错误

because

function() {
    this.val=7;
}();

被评估为函数宣言函数声明需要一个名称。使其解释为函数表达,您需要将其放在括号中:

 (function() {
    this.val=7;
 }());

(使其成为立即函数)

或将函数分配给变量:

var f = function() {....};
f();

您在第二个片段中所做的事情是两者的混合,虽然有效,但没有多大意义。f将会有价值undefined.

我不明白函数是否是对象那么为什么匿名函数中的 this 指向window并不是demo.

函数不会继承调用它们的上下文。每个函数都有它自己的this以及什么this指的是由how该函数被调用。它基本上可以归结为:

  • “独立”(func()) 或作为立即函数 ((function(){...}()) ) : this将引用全局对象(window在浏览器中)

  • 作为对象的属性(obj.func()): this将参考obj

  • With the new [docs] https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/new keyword ( new Func() ): this refers to an empty object that inherits from Func.prototype

  • apply [docs] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply and call [docs] https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/call methods ( func.apply(someObj) ): this refers to someObj


进一步阅读:

  • MDC JavaScript 指南 - 函数 https://developer.mozilla.org/en/JavaScript/Guide/Functions
  • MDC JavaScript 参考 - 函数和函数范围 https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope
  • ECMAScript 5,第 13 节 - 函数定义 http://ecma262-5.com/ELS5_HTML.htm#Section_13
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

匿名函数的上下文是什么? 的相关文章

  • 如果字符串不匹配,.split() 返回什么?

    在此 JavaScript 代码中 如果变量data没有那个角色 那么 split 会返回什么呢 x data split 它会是原始字符串的数组吗 是的 根据ECMA262 15 5 4 14 String prototype split
  • setInterval() 如何影响性能?

    我们正在使用 Twitter Bootstrap 作为框架构建一个 Web 应用程序 但在显示 隐藏工具提示时遇到问题 除了尝试找到实际问题的解决方案之外 我还有一个关于我们同时使用的解决方法的问题 从性能角度来看 使用 setInterv
  • 缩小 ASP.NET 生成的 Javascript 的最佳方法是什么?

    在 ASP NET 3 5 运行时缩小 ASP NET 生成的 Javascript 例如由 webresource axd 提供的 Javascript 的最佳方法是什么 我尝试使用Mb压缩 http mbcompression code
  • 使用通过 (document.getElementById('ID')) 添加到数组的元素

    为什么这段代码不起作用 var all obj element new Array all obj element 0 document getElementById Img3 alert all obj element 0 style w
  • 在 Node.js 中实现服务器发送事件的简单方法?

    我环顾四周 似乎在 Node js 中实现 SSE 的所有方法都是通过更复杂的代码 但似乎应该有一种更简单的方法来发送和接收 SSE 是否有任何 API 或模块可以让这件事变得更简单 这是一个每秒发送一个服务器发送事件 SSE 的 Expr
  • 传单圆圈绘制/编辑问题

    我第一次制作传单 并面临绘制圆圈和编辑 更改圆圈位置 的问题 我面临的问题是 编辑 移动 圆从一个位置到另一位置会改变其半径 Note 请尝试在给定的小提琴中在地图顶部创建圆圈 然后通过单击编辑按钮将其移动到底部 如果我在地图的顶部创建圆圈
  • 如何使用 QuerySelector 获得第二个匹配项?

    以下语句给出了该类的第一个元素titanic element document querySelector titanic 我如何检索具有相同类的第二个元素 Use document querySelectorAll https devel
  • Express.js - 监听关闭

    我有一个使用 Express 的 Node js 应用程序 在该应用程序中 我有一个如下所示的块 const app require app const port process env PORT 8080 const server app
  • 如何将多个文件上传到Firebase?

    有没有办法将多个文件上传到 Firebase 存储 它可以在一次尝试内上传单个文件 如下所示 fileButton addEventListener change function e Get file var file e target
  • 如何使用 Selenium webdriver 测试对 SVG 对象的点击?

    我正在尝试编写代码来检查单击 SVG 对象的功能 例如此 URL 上的美国州 http www amcharts com svg maps map usa 这可行 但是有更好的方法吗 不需要物理移动鼠标的东西 robert new Robo
  • 如何使用 Eclipse 作为 Javascript IDE?

    我从官方下载页面下载了 eclipse Javascript IDE 但是 当我启动应用程序时 它显示 必须提供 Java 运行时环境或 Java 开发工具包才能运行 eclipse 我已经有一个运行良好的 eclipse 的 java I
  • Puppeteer 无法在 VPS (DigitalOcean) 上工作

    我在水滴中数字海洋 https www digitalocean com 我收到这个错误 node 5549 UnhandledPromiseRejectionWarning TimeoutError Navigation Timeout
  • AngularJS:ng-show 与 display:none

    我有一个用例 我必须使用 CSS 默认隐藏 HTML 元素 如下所示 HTML div class item div CSS item display none 但是 我需要在页面加载后使用 ng show 切换元素的可见性 如下所示 di
  • JavaScript - 类根据条件扩展

    事情是这样的 我有一个名为 A 的主课 我希望这个班级能够扩展 B 级 class A extends B 但事实上 我希望 B 类在特定条件下扩展 C D 或 E class B extends B1 or class B extends
  • 如何比较两个对象数组并更改两个数组中找到的对象的值?

    假设我有两个对象数组 let array1 id 1 name snow id 4 name jo id 8 name bran id 12 name gondo id 13 name peter
  • jQuery 和所有 .js 文件无法在本地运行,只能在外部运行

    我有一个奇怪的问题 我正在编写一个网站 包括 jQuery 和一些插件 它们存储在 js 文件夹中 当我尝试通过浏览器 jQuery 打开它时 插件和所有自定义脚本都不起作用 也许这与我的代码有关 但不这么认为 当然 当我在外部包含 jQu
  • 输入和文本区域可以拖动吗?

    MDN 规范以及我能通过 Google 找到的每个网站都说所有 HTML 元素都可以拖动 然而 在实践中 我发现我无法拖动文本输入或文本区域 即使它们已被禁用 例如 使用以下代码 img src http www placehold it
  • 如何设置 .eslintrc 来识别“require”?

    我是新来的ESLint http eslint org 并且我已经成功地将 ESLint 与IntelliJ https www jetbrains com idea 开箱即用 我的 ESLint 集成无法识别node 但对文档的基本审查表
  • 具有值的 TextInput 不会更改值

    在我的react native应用程序中 我有一个API 我从中检索数据 并且我在输入值中设置数据 用户应该能够编辑这些输入并更新 但是当我尝试输入输入时它不会输入任何内容并且值保持原样 这是 TextInput 代码
  • nodeJS exec 不适用于“cd”shell cmd

    var sys require sys exec require child process exec exec cd home ubuntu distro function err stdout stderr console log cd

随机推荐

  • 如何在 ffmpeg 命令中缩放并添加正确的徽标?

    我正在尝试应用水印 并通过 ffmpeg 命令将其缩放到当前视频大小 这是我最初的无水印命令 ffmpeg v 0 vcodec h264 qsv i udp some ip 1234 fifo size 1000000 overrun n
  • 使用 jQuery 更改 HTML 标签?

    这可能吗 example a change click function code to change p tag to h5 tag p Hello p a change a 因此 单击更改锚点应该会导致 p Hello p 部分更改为
  • Bash 脚本错误地计算了自身的实例

    我创建了一个bash计算自身已启动实例的脚本 就是这样 在这个例子中 我显示的是实例 而不是用wc l bin bash nb ps aux grep count itself sh echo nb sleep 20 当然 我的脚本名为co
  • 在标准 NSWindow 上创建自定义标题栏

    我一直在尝试为我的菜单栏应用程序构建特定的外观 我一直在使用NSWindow with a NSBorderlessWindowMask样式蒙版和设置 window setOpaque NO and window setBackground
  • 适用于 boto3 的 PyCharm 智能感知

    在 PyCharm 中查看完整的智能感知 代码完成 选项时遇到问题 在 Windows 上使用 python 3 4 这些建议部分有效 import boto3 s boto3 Session boto3 will bring up lis
  • Cabal 无法确定 GHC 版本

    我目前正在尝试通过执行以下操作来更新 Cabal 1 14 0 cabal install 版本 0 14 0 cabal install cabal install 但是 这给了我一个 ExitFailure1 错误 setup The
  • 为什么在 Linux 中使用 kmalloc 和 GFP_DMA 时会得到高地址?

    我正在 Linux 中为 DMA 设备编写设备驱动程序 在Linux 设备驱动程序 第 15 章 http lwn net images pdf LDD3 ch15 pdf 它说 对于有这种限制的设备 应该分配内存 通过将 GFP DMA
  • 如何在沙盒 iframe (IE11) 中使用 javascript 创建 iframe 内容?

    我正在尝试通过创建 iframe 并使用 javascript 或 vbscript 动态构建 iframe 内容来构建在 Internet Explorer 中使用的测试页面 我通常会使用 data URI 但 IE 会阻止它 例子 看来
  • 迭代自定义元素中的 HTMLCollection

    如何在另一个自定义元素的 Shadow dom 中迭代一个自定义元素的实例 HTMLCollections 似乎没有按预期运行 我是一个 jQuerian 而且是普通 js 的新手 所以我确信我在某个地方犯了一个明显的错误 HTML
  • 有 CSS 媒体查询来检测 Windows 吗?

    我想指定两种略有不同的背景颜色 一种用于 Mac OS 一种用于 Windows 没有属性来指定用于查看网页的操作系统 但您可以使用 javascript 检测它 这里是检测操作系统的一些示例 var OSName Unknown OS i
  • Heroku 和 Zerigo 设置问题

    EDIT2 等待查看我的更改是否成功 编辑 我使用命令行 Zerigo install 命令重新安装了所有内容 最初的问题是手动设置 现在的问题是 我设置的自定义域无法正常工作 访问自定义域只会在 Chrome 中返回错误 哎呀 Googl
  • 用于构建成就系统的 Ruby/Rails 现代化工具

    我有兴趣为我的 Ruby on Rails 应用程序构建一个强大的成就系统 成就可以通过多种方式实现 通常 我们会有一些可能发生在多个模型上的标准 一些是必需的 一些是触发成就的可选 混合和匹配 我想说这类似于此处或 Foursquare
  • WPF-Prism CanExecute 方法未被调用

    我正在编写一个简单的登录用户控件 其中包含两个文本框 用户名和密码 和一个登录按钮 我希望仅在填写用户名和密码字段时启用登录按钮 我正在使用 Prism 和 MVVM LoginViewModel 包含一个名为 LoginCommand 的
  • 如何替换 Postgres 中的表?

    基本上我想这样做 begin lock table a alter table a rename to b alter table a1 rename to a drop table b commit 即获得控制权并替换我的旧桌子 而没有人
  • java.lang.ArrayIndexOutOfBoundsException : 0 是什么意思

    我的编译器一直指向这一行 arr i new specialDelivery name name2 weight special 和这个 arr i new specialDelivery name name2 weight special
  • Qt5参考文档:qch文件

    我想在 QtAssistant 中查看 Qt 参考文档 但是 Qt5 的安装没有附带 Qt 库的 qch 文档文件 我试图在http qt project org http qt project org但到处都找不到它们 如何获取 Qt5
  • 如何禁用 reCAPTCHA Flask App Builder

    我是 Flask 应用程序构建器的新手 正在尝试设置用户注册 但出于我的目的 我不需要 reCAPTCHA 有没有办法在配置文件中禁用 reCaptcha 我的配置文件如下所示 Uncomment to setup Public role
  • 在调用中使用查询参数时缓存记录? Ember-数据

    我有这条路线检索 2 个模型 App PanelRoute Ember Route extend model function var topologymin this store find topologymin var metricma
  • 自定义字体 Xcode 4.3

    我正在尝试使用这个字体 http www dafont com chalkboard font在我的项目中 但它不起作用 我在项目中添加了 ttf 文件 并将其名称添加到 MyApp Info plist 的键下 应用程序提供的字体 然后我
  • 匿名函数的上下文是什么?

    我有这样的代码 function demo this val 5 function this val 7 现在 当我在 Firefox 或 Chrome 控制台中执行此代码时 它会出现语法错误 我不明白为什么这是一个错误 因为我读过 jav