什么是;使用“严格的”;在JavaScript中执行,其背后的原因是什么?
最近,我通过Crockford运行了一些JavaScript代码,它给出了以下错误: 第1行字符1出现问题:缺少“use strict”语句 做了一些搜索,我意识到有些人添加了什么是;使用“严格的”;在JavaScript中执行,其背后的原因是什么?,javascript,syntax,jslint,use-strict,Javascript,Syntax,Jslint,Use Strict,最近,我通过Crockford运行了一些JavaScript代码,它给出了以下错误: 第1行字符1出现问题:缺少“use strict”语句 做了一些搜索,我意识到有些人添加了“使用严格”转换为他们的JavaScript代码。一旦我添加了语句,错误就不再出现了。不幸的是,谷歌没有透露这个字符串语句背后的很多历史。当然,这一定与浏览器如何解释JavaScript有关,但我不知道会产生什么效果 那么什么是“严格使用”所有关于,它意味着什么,它仍然相关吗 当前的浏览器是否响应的“严格使用”字符串还是供
“使用严格”
转换为他们的JavaScript代码。一旦我添加了语句,错误就不再出现了。不幸的是,谷歌没有透露这个字符串语句背后的很多历史。当然,这一定与浏览器如何解释JavaScript有关,但我不知道会产生什么效果
那么什么是“严格使用”代码>所有关于,它意味着什么,它仍然相关吗
当前的浏览器是否响应的“严格使用”代码>字符串还是供将来使用?这是ECMAScript 5的新功能。约翰·雷斯格写了一篇文章
它只是一个放入JavaScript文件中的字符串(位于文件顶部或函数内部),如下所示:
"use strict";
现在将它放入代码中不会对当前浏览器造成任何问题,因为它只是一个字符串。如果您的代码违反pragma,将来可能会导致代码出现问题。例如,如果您当前有foo=“bar”
,而没有首先定义foo
,那么您的代码将开始失败……这在我看来是一件好事。这篇关于Javascript严格模式的文章可能会让您感兴趣:
引用一些有趣的部分:
严格模式是ECMAScript 5中的一项新功能,允许您将程序或函数置于“严格”操作上下文中。这种严格的上下文阻止执行某些操作,并引发更多异常
以及:
严格模式有两种帮助:
- 它捕获一些常见的编码blooper,抛出异常
- 当采取相对“不安全”的操作(例如访问全局对象)时,它可以防止或抛出错误
- 它会禁用令人困惑或考虑不周的功能
另外请注意,您可以对整个文件应用“严格模式”。。。或者您只能将其用于特定函数(仍引用John Resig的文章):
//非严格代码。。。
(功能(){
“严格使用”;
//严格定义你的库。。。
})();
//非严格代码。。。
如果必须混合使用新旧代码,这可能会有所帮助;-)
因此,我认为它有点像您可以在Perl中使用的“use strict”
(因此得名?):它通过检测更多可能导致中断的内容来帮助您减少错误
现在是严格模式
内部(使用import
和export
语句)和,严格模式始终处于启用状态,不能禁用。如果使用去年左右发布的浏览器,则它很可能支持JavaScript严格模式。只有ECMAScript 5成为当前标准之前的旧浏览器不支持它
命令周围的引号确保代码在较旧的浏览器中也能工作(尽管在严格模式下生成语法错误的东西通常只会导致脚本在较旧的浏览器中以某种难以检测的方式出现故障).如果人们担心使用使用strict
,那么这篇文章可能值得一看:
NovoGeek.com-克里希纳的博客
它谈到了浏览器支持,但更重要的是如何安全地处理它:
function isStrictMode(){
return !this;
}
/*
returns false, since 'this' refers to global object and
'!this' becomes false
*/
function isStrictMode(){
"use strict";
return !this;
}
/*
returns true, since in strict mode the keyword 'this'
does not refer to global object, unlike traditional JS.
So here, 'this' is 'undefined' and '!this' becomes true.
*/
“严格使用”;是一种保证,程序员不会使用JavaScript的松散或不良属性。它是一个向导,就像一把尺子可以帮你画直线一样。“使用严格”将帮助您进行“直接编码”
那些不喜欢使用标尺直接执行代码的人通常会在页面中要求其他人调试他们的代码
相信我。与设计糟糕的代码相比,开销可以忽略不计。就个人而言,我喜欢随时回到他的网站,以确保我不会忘记我的良好做法
现代JavaScript实践应始终唤起“严格使用”;pragma.ECMA小组选择“严格”模式的唯一原因是允许经验较少的程序员访问JavaScript,然后给他们时间来适应新的更安全的编码实践。我强烈建议每个开发人员现在就开始使用严格模式。有足够多的浏览器支持它,严格模式将合法地帮助我们避免我们甚至不知道代码中存在的错误
显然,在最初阶段会出现我们从未遇到过的错误。为了获得充分的好处,我们需要在切换到严格模式后进行适当的测试,以确保捕获了所有内容。我们肯定不会在代码中抛出使用strict
,并假设没有错误。因此,现在是时候开始使用这个非常有用的语言特性来编写更好的代码了
比如说,
var person = {
name : 'xyz',
position : 'abc',
fullname : function () { "use strict"; return this.name; }
};
是Douglas Crockford编写的调试器。只需粘贴到脚本中,它就会快速扫描代码中任何明显的问题和错误。警告一句,所有努力收费的程序员:对现有代码应用“严格使用”
,可能会有危险!这个东西不是一些感觉良好、开心的贴纸,你可以贴在代码上使它“更好”。使用“use strict”
pragma,浏览器会突然在以前从未抛出过的随机位置抛出异常,因为此时您正在做一些默认/松散JavaScript允许但严格JavaScript厌恶的事情!您的代码中很少使用的调用中可能隐藏着严格性冲突,这些调用只有在它们最终运行时才会抛出异常—例如,在付费客户使用的生产环境中
如果你打算冒险的话,最好是
var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};
function Tree(typeOfTree) {
var age;
var leafCount;
age = typeOfTree.age;
leafCount = typeOfTree.leafCount;
nameoftree = typeOfTree.name;
};
var tree1 = new Tree(tree1Data);
console.log(window);
"use strict";
var tree1Data = {
name: 'Banana Tree',
age: 100,
leafCount: 100000,
name:'Banana Tree'
};
var hasStrictMode = (function() { "use strict"; return this===undefined }());
if(a<b){ function f(){} }
var n = 023;
function f() {
"use strict";
this.a = 1;
};
f();
{a: 1, b: 3, a: 7}
f(a, b, b){}
function f(x){
"use strict";
var a = 12;
b = a + x*35; // error!
}
f();
"use strict";
arguments++;
var obj = { set p(arguments) { } };
try { } catch (arguments) { }
function arguments() { }
'use strict';
var a = 365;
var b = 030;
// File: myscript.js
'use strict';
var a = 2;
....
function doSomething() {
'use strict';
...
}
(function() {
"use strict";
your code...
})();
function useStrictDemo(){
'use strict';
//works fine
var a = 'No Problem';
//does not work fine and throws error
k = "problem"
//even this will throw error
someObject = {'problem': 'lot of problem'};
}
"use strict";
var arguments = 3.14; // This will cause an error
function strict() {
// Function-level strict mode syntax
'use strict';
function nested() { return 'And so am I!'; }
return "Hi! I'm a strict mode function! " + nested();
}
function notStrict() { return "I'm not strict."; }
console.log(strict(), notStrict());
'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);
'use strict';
// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError
// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError
// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError
// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError
function getname(){
name = "Stack Overflow"; // Not using var keyword
return name;
}
getname();
console.log(name); // Stack Overflow
"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
var city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago
city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago
'use strict';
city = "Chicago"
console.log(city) // Reference Error: asignment is undeclared variable city.
module.exports = {
env: {
es6: true
},
rules : {
strict: ['error', 'global'],
},
};
"use strict";
function x(p1, p2) {};
delete x; // This will cause an error
"use strict";
function x(p1, p1) {}; // This will cause an error
"use strict";
var arguments = "value"; //This will generate an error
var static = "value 2"; //This will also generate an error
"use strict";
myVar = 0; //This will generate an error.
counter = 9;//This will generate an error too.
counter++;
"use strict";
function myFunc() {
return true;
}
delete myFunc; //This will generate an error
var myVar = 0;
delete myVar; //This will generate an error too.