最近,我通过Crockford的JSLint运行了一些我的JavaScript代码,它给出了以下错误:
第1行问题1:缺少"使用严格"声明.
做一些搜索,我意识到有些人会加入"use strict";
他们的JavaScript代码.一旦我添加了语句,错误就会停止显示.不幸的是,谷歌没有透露这个字符串声明背后的历史.当然它必须与浏览器如何解释JavaScript有关,但我不知道效果会是什么.
那么它是"use strict";
什么,它意味着什么,它是否仍然相关?
当前的任何浏览器都会响应"use strict";
字符串还是将来使用?
我已经开始探索Node.js并编写了许多演示Web应用程序,以了解Node.js,Express.js,jade等的流程.
但最近我遇到的一件事是声明"use strict"
作为每个函数和每个.js
文件中的第一行.
Node.js究竟是如何解释的?
在严格模式下使用javascript时,为什么这个匿名函数未定义?我理解为什么这可能有意义,但我找不到任何具体的答案.
例:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
Run Code Online (Sandbox Code Playgroud)
小提琴测试:http://jsfiddle.net/Pyr5g/1/ 查看记录器(firebug).
除了"use strict"
防止错误编码之外,还有哪些额外的好处?例如,它是否允许脚本运行得更快,因为解释器知道它的优化代码?
我正在使用"使用严格"的函数形式,并且不希望Babel在翻译后添加的全局形式.问题是我使用的是一些没有使用"use strict"模式的库,并且在脚本连接后可能会抛出错误
use strict
启用时是否可以看到函数的被调用者/调用者?
'use strict';
function jamie (){
console.info(arguments.callee.caller.name);
//this will output the below error
//uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
};
function jiminyCricket (){
jamie();
}
jiminyCricket ();
Run Code Online (Sandbox Code Playgroud)
存在用于Python的静态分析工具,但编译时间检查往往与Python所包含的运行时绑定哲学截然相反.这可能与一个静态分析工具来执行一些"包装标准Python解释器使用严格 "般的约束,但我们没有看到任何广泛采用的这样的事情.
有没有关于Python的东西会使"使用严格"的行为变得不必要或特别不受欢迎?
或者,Perl中的"使用严格"行为是否已被广泛采用?
注意:"必要"是指"实际必要",并非绝对必要.显然你可以在没有"use strict"的情况下编写Perl,但是(从我所见过的)大多数Perl程序员都会使用它.
注意:Python解释器包装器不需要 "使用严格"类似的约束 - 您可以使用类似于"use strict"的伪编译指示,这将被普通解释器忽略.我不是在谈论添加语言级功能.
更新:解释Perl每条评论中"use strict"的作用.(官方文档链接在第一段.)
"use strict"指令有三个不同的组件,其中只有两个非常有趣:
use strict vars:在程序中静态检查词法范围的变量用法.(请记住,在Python中,基本上只有global
范围和local
范围).许多Python短信检查这种事情.因为它是他们可以做的唯一的静态分析,所以直言不讳地假设你使用简单的词汇范围,并在你告诉他们闭嘴之前警告你那些看似错误的东西; 即
FOO = 12
foo += 3
Run Code Online (Sandbox Code Playgroud)
如果您没有对命名空间做任何想法,那么检查拼写错误就很有用.
use strict refs:防止符号命名空间解除引用.Python最接近的模拟是使用locals()
和globals()
进行符号绑定和标识符查找.
use strict subs:在Python中没有真正的模拟.
python compiler-construction perl static-analysis use-strict
我最近开始使用JSHint,它要求我使用"use strict"的函数形式.从那以后,AngularJS抛出一个错误:
"错误:参数'webAddressController'不是函数,未定义"
当我删除"use strict"的函数形式时,控制器加载正常.
控制器:
(function () {
"use strict";
function webAddressController($scope, $rootScope, web_address_service) {
// Do things
}
}());
Run Code Online (Sandbox Code Playgroud)
有没有人对这里发生的事情有任何见解?
当我用jslint验证以下代码时,我得到以下错误.
function displayMegaDropDown() {
"use strict";
var liMegaPosition, divMegaOffset;
liMegaPosition = jQuery(this).position();
divMegaOffset = { top: liMegaPosition.top + jQuery(this).height(), left: liMegaPosition.left };
jQuery(this).find("div").offset(divMegaOffset);
jQuery(this).addClass("hovering");
}
Run Code Online (Sandbox Code Playgroud)
第4行字符29处的问题:严格违规.
Run Code Online (Sandbox Code Playgroud)liMegaPosition = jQuery(this).position();
第5行的问题56:严格违规.
Run Code Online (Sandbox Code Playgroud)divMegaOffset = { top: liMegaPosition.top + jQuery(this).height(), left: liM...
第6行第12个问题:严格违规.
Run Code Online (Sandbox Code Playgroud)jQuery(this).find("div").offset(divMegaOffset);
第8行第12个问题:严格违规.
Run Code Online (Sandbox Code Playgroud)jQuery(this).addClass("hovering");
我猜这是因为使用了jQuery(这个),但我不明白要用什么替换它.请注意,这不是因为jQuery未声明为全局.
我想知道,因为我试图用use strict
,它的问题,如果我一起去"use strict"
还是'use strict'
?
这些都是"更正确"的选择吗?