- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在看这个讲座:http://www.youtube.com/watch?v=Kq4FpMe6cRs
// the speaker states that "'bar' is just some function
// that invokes whatever function is passed to it"
function bar(fn) {
fn();
}
function foo() {
var x = 8;
bar(function baz() { return x; });
}
Object.prototype.x = 'foo';
在第 35 分钟,出现了上面显示的问题。讲师指出,某些浏览器将返回 foo
而不是 8
。
为什么?
顺便说一句,在写这个问题时,我想通了,但我还是会发布这个问题,因为这是一个有趣的问题。 :)
现场演示: http://jsfiddle.net/simevidas/mHyKc/
Opera 11 提示 'foo'
,我所有其他浏览器(包括 IE9)返回 8
。
更新:我收回我所说的已经解决了这个问题。它与嵌套函数是命名函数有关。如果您删除名称 (baz
),Opera 将返回 8
,这意味着该问题仅出现在命名的嵌套函数中。
但为什么呢?
最佳答案
我承认我查过了。至少可以说,我认为我不会那么容易地弄清楚这个问题。 http://kangax.github.com/nfe/#spidermonkey-peculiarity
要理解这个问题,命名函数表达式的语义是必要的。引用该链接,“命名函数表达式的标识符仅适用于函数的局部范围。”具体来说,这意味着:
var fn = function aNamedFunction() {
typeof aNamedFunction; // "function"
};
typeof aNamedFunction; // "undefined"
为了实现这个行为,SpiderMonkey 和其他 JS 引擎创建了一个虚拟 environment frame在父框架(即定义函数的范围)和函数的内部框架之间,它在每次调用函数时创建。这个虚拟框架的构造就像调用了 new Object()
一样,并且包含从 aNamedFunction
到函数对象本身的映射。
在问题的代码示例中,x
通过首先查看函数调用的最内层框架来解决。由于函数体没有声明 var x;
,因此没有找到它,解释器检查上一级的框架,即虚拟框架。由于虚拟框架是由 new Object()
(或语义上等效的东西)创建的,因此在虚拟框架中查找 x
将遍历原型(prototype)链,就像它对任何其他 JavaScript 对象。因此,它搜索 Object.prototype
,找到绑定(bind)到 x
的字符串 'foo'
,并返回它。
感谢 ES5 一致的词法作用域。
另类阅读:http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/#nfe-and-spidermonkey
关于javascript - EcmaScript 5 Google TechTalk - 范围事故 1 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200796/
我尝试使用 Specflow 编写一些功能。不幸的是,通过以下 URL 安装后,我无法在系统中的任何地方找到 techtalk.specflow.dll。 http://visualstudiogal
我的场景读取一个包含数百行的文件。每行调用一个 API 服务,但该服务可能未运行。如果我收到非 200 响应(在“Then”方法中可用),我想放弃场景并节省时间。我如何告诉 TechTalk Spec
我使用“下载”按钮安装了 Specflow from the VS2013 specflow page 我使用添加新项目并选择 SpecFlow 功能文件向我的 Specs 项目添加了一项功能 当我构
我想在 [Binding] 属性标记类的测试失败后执行 [AfterTestRun] 属性标记方法。我怎样才能实现这样的目标: [Binding] public class TestsRunner {
我有几个包含某些场景的功能文件。我需要忽略几个场景或功能,根据某些条件用一些 @tag 标记。我读过specflow documentation但没有找到对我的解决方案有用的东西。我想用类似的东西 [
我有一个设置为使用 SpecFlow 1.8.1 和 mstest 的 VS2010 单元测试项目。为了让 SpecFlow 单元测试正常工作,我做了以下工作:- 我在我的项目中添加了对以下文件的引用
我正在看这个讲座:http://www.youtube.com/watch?v=Kq4FpMe6cRs // the speaker states that "'bar' is just some f
我以前见过这个问题,但我相信它没有得到解决。基本上我的设置是这样的:对比 2015Specflow ver 1.9.0(我根据其他没有帮助的问题从 2.1.0 降级到此版本) 当我尝试构建我的项目时,
我正在尝试为 specflow 编写一个 StepArgumentTransformation。 我有以下小 cucumber Scenario: Test Arguments Given user
在 Visual Studio 2019 中,我可以在测试资源管理器中完美地构建和运行我的特定测试用例。但我从命令行运行,显示以下错误。 Discovered 1 tests Thread#0: Th
尝试在 VS 2015 中编译 SpecFlow 项目时出现以下错误。 error Generation error: Could not load file or assembly 'TechTal
使用任务 dotnet build 的构建管道开始失败,因为 Build Engine 版本最近从 16.4.0+ 更改为 16.5.0+。 nuget 包 SpecFlow 依赖于库 TechTal
我是一名优秀的程序员,十分优秀!