最近,我通过Crockford的jslint 输入了一些我的笔记本代码, 它犯了以下错误:
第1行字符1:缺少“严格使用”的语句。
某些搜索, 我意识到有些人在他们的 javascript 代码中添加了“ 严格使用 ” ; 。 一旦我添加了该语句, 错误就不再出现。 不幸的是, Google 并没有揭示此字符串语句背后的大部分历史。 当然, 它肯定与浏览器如何解读该语句有关, 但我不知道效果会是什么 。
那么,什么是“严格使用”;什么是“严格使用”;一切,它意味着什么,它是否仍然相关?
当前的任何浏览器是否响应“ 严格使用 ” ; 字符串, 或是否未来使用 ?
我强烈建议每个开发商现在就开始使用严格模式。 有足够的浏览器支持严格模式,
显然,在最初的阶段,我们从未遇到过错误。 为了获得全部好处,我们需要在转换到严格模式后进行适当的测试,以确保我们掌握了一切。 当然,我们不只是在代码中严格使用,而且假设没有错误。 因此,语气是,是时候开始使用这个非常有用的语言功能来写更好的代码了。
例如,
var person = {
name : 'xyz',
position : 'abc',
fullname : function () { "use strict"; return this.name; }
};
jslint 是由 douglas crockford 撰写的调试器。 只需在您的脚本中粘贴, 它就能快速扫描您的代码中的任何明显问题和错误 。
严格模式可以防止内存泄漏。
请检查以下以非限制模式写入的函数 :
function getname(){
name = "Stack Overflow"; // Not using var keyword
return name;
}
getname();
console.log(name); // Stack Overflow
在此函数中, 我们正在使用函数中的变量 。 内部, 编译者将首先检查该函数范围中是否有以该特定名称宣布的变量。 由于编译者了解不存在此变量, 它将在外部范围中检查。 在我们的情况中, 它就是全球范围。 汇编者再次理解全球空间中也没有以该名称宣布的变量, 因此在 Glob 中为我们创建了这样一个变量
另一个假设是,比如,变量在子函数中被声明为子函数。 在这种情况下, 编译者检查该变量在外部范围中的有效性, 即父函数。 只有这样它才能在全球空间中检查并创建变量。 这意味着需要做更多的检查。 这将影响应用程序的性能 。
现在让我们以严格的方式写出相同的函数。
"use strict"
function getname(){
name = "Stack Overflow"; // Not using var keyword
return name;
}
getname();
console.log(name);
我们将获得以下错误 。
Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5
在此, 编译器会丢弃引用错误。 严格地说, 编译器不允许我们使用变量而不声明它。 这样可以防止内存泄漏。 此外, 我们可以写入更优化的代码 。
要比较的小示例 :
无限制模式 :
(一) [1,2,3] 控制台.log(一) / 输出: / 1/ / 2/ 3
严格模式 :
“ 严格使用 ” ; 对于 (i) [1, 2, 3]) 控制台. log(i) / 输出: // / 未捕获引用器: i 未定义
无限制模式 :
字符串. prototype. test = 函数 () { 控制台. log( 此“ 字符串” 类型); } } ; a. test (); // 输出 // 假
字符串类型. prototype. test = 函数 () {“ 严格使用 ” {; 控制台. log( 此“ 字符串” 的类型) } ; a. test (); // 输出 / / true
语句“ 严格使用 ” ; 指示浏览器使用严格模式, 即一个缩写和安全的 Javastrict 特征集 。
特征列表列表(并非详尽无遗)
不允许的全变量 。 (在变量名称中缺少 var 声明和打字符) 静态失效分配将会在严格模式下丢出错误( 指派 nan = 5 ;) 试图删除非可删除属性将会丢弃( 删除对象 . prototype) , 要求对象字典中的所有属性名称都是独特的( var x = {x1: 1, x1: 1, x1: 2}) 函数参数名称必须是独一无二的( 函数和( x, x) {...}) 禁止八语法( var x = 023; 一些 deds 错误地假定前的零 doe
[参考:严格模式,mozilla 开发者网络]
实例:
严格模式代码不能用别名来描述在其中创建的参数对象的属性
function show( msg ){
msg = 42;
console.log( msg ); // msg === 42
console.log( arguments[0] ); // arguments === 42
}
show( "Hey" );
// In strict mode arguments[i] does not track the value of
// the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i]
function showStrict( msg ){
"use strict";
msg = 42;
console.log( msg ); // msg === 42
console.log( arguments[0] ); // arguments === "Hey"
}
showStrict( "Hey" );