我在MDC或ECMAscript规范中没有找到关于我的问题的任何内容.可能有人知道一种更"笨拙"的方法来解决这个问题.
我正在调用"use strict"我环境中的每个javascript文件.我的所有文件都是这样开始的
(function(win, doc, undef) {
"use strict";
// code & functions
}(window, window.document));
Run Code Online (Sandbox Code Playgroud)
现在,我有一个处理错误的自定义函数.该函数使用该.caller属性来提供上下文堆栈跟踪.看起来像这样:
var chain = (function() {
var _parent = _error,
_ret = '';
while( _parent.caller ) {
_ret += ' -> ' + _parent.caller.name;
_parent = _parent.caller;
}
return _ret;
}());
Run Code Online (Sandbox Code Playgroud)
但是,当然,在严格模式下.caller是一个不可删除的道具,在检索时抛出.所以我的问题是,是否有人知道如何禁用更严格的"功能明智"?
"use strict";在被调用之后被所有函数继承.现在我们有可能在特定函数中使用严格模式,只需调用它们"use strict";的顶部,但有没有办法实现相反的目的?
无论如何都要检查是否强制执行严格模式'use strict',并且我们想要为严格模式执行不同的代码,而为非严格模式执行其他代码.寻找像这样的功能isStrictMode();//boolean
JavaScript 1.8.5(ECMAScript 5)添加了一些有趣的方法,可以防止将来修改传递的对象,具有不同程度的彻底性:
据推测,这些问题的关键在于捕获错误:如果您知道在某个点之后不想修改对象,则可以将其锁定,以便在以后无意中尝试修改时会抛出错误.("use strict";假设你已经完成了.)
我的问题:在现代JS引擎(如V8)中,使用上述方法锁定对象时是否有任何性能优势(例如,更快的属性查找,减少内存占用)?
(另请参阅John Resig的好解释 - 但不提及性能.)
我想知道什么时候应该使用
Object.defineProperty
Run Code Online (Sandbox Code Playgroud)
为对象创建新属性.我知道我能够设置类似的东西
enumerable: false
Run Code Online (Sandbox Code Playgroud)
但你什么时候需要这个呢?如果你只是设置一个属性
myObject.myprop = 5;
Run Code Online (Sandbox Code Playgroud)
它的描述符都设置为true,对吧?当你们使用.defineProperty()的相当冗长的调用以及出于什么原因时,我实际上更好奇.
我有一个对象,可以是任意数量的级别,可以有任何现有的属性.例如:
var obj = {
db: {
mongodb: {
host: 'localhost'
}
}
};
Run Code Online (Sandbox Code Playgroud)
在那我想设置(或覆盖)属性,如下所示:
set('db.mongodb.user', 'root');
// or:
set('foo.bar', 'baz');
Run Code Online (Sandbox Code Playgroud)
属性字符串可以有任何深度,值可以是任何类型/东西.
如果属性键已存在,则不需要合并作为值的对象和数组.
上一个示例将生成以下对象:
var obj = {
db: {
mongodb: {
host: 'localhost',
user: 'root'
}
},
foo: {
bar: baz
}
};
Run Code Online (Sandbox Code Playgroud)
我怎么才能实现这样的功能呢?
我理解eval()在非严格的上下文中是如何工作的,但是eval()在严格模式下使用的情况完全让我迷惑不解.如果eval()是在全球范围内直接调用,变量保存在新的内部eval()范围:
'use strict';
eval('var a = 1;');
console.log(a); // ReferenceError: a is not defined
Run Code Online (Sandbox Code Playgroud)
但是,如果我在全局范围内执行间接调用eval()(应该是同一个东西,对吗?),它就好像它不是在严格模式下(如果你不相信我,请看这个JSFiddle):
'use strict';
(0, eval)('var a = 1;'); // indirect call to eval
console.log(a); // 1???
Run Code Online (Sandbox Code Playgroud)
如果你不明白是什么(0, eval),请参阅为什么谷歌主页使用(0,obj.func)(args)语法?.
至少根据我对如何eval()在严格模式下工作的理解,它意味着(无论eval()是直接还是间接调用)为eval()调用中定义的变量创建一个新的范围,但这似乎不是这里的情况.规范说明如下:
10.4.2输入Eval代码
当控件进入eval代码的执行上下文时,执行以下步骤:
如果没有调用上下文或者eval代码没有通过直接调用(15.1.2.1.1)评估到eval函数那么,
一个.将执行上下文初始化为使用eval代码作为C的全局执行上下文,如10.4.1.1中所述.
其他,
一个.将ThisBinding设置为与调用执行上下文的ThisBinding相同的值.
湾 将LexicalEnvironment设置为与调用执行上下文的LexicalEnvironment相同的值. …
我对javascript很新,但我很喜欢它的危险快速和松散的表现力.也就是说,我注意到显然在"使用严格"模式下操作时,您无法删除对象.我不是一个删除东西的忠实粉丝(因为从理论上讲,范围应该照顾到这一点),但我想知道删除这个功能背后的动机是什么?
假垫片和假牙有什么区别?
是否足以包含es5-shim.min.js和es6-shim.min.js,还是应该包括es5-sham.min.js和es6-sham.min.js?
我不知道是什么样的区别let,并const在ES6.它们都是块作用域,如以下代码中的示例所示:
const PI = 3.14;
console.log(PI);
PI = 3;
console.log(PI);
const PI = 4;
console.log(PI);
var PI = 5;
console.log(PI);
Run Code Online (Sandbox Code Playgroud)
在ES5中,输出将是:
3.14
3.14
3.14
3.14
Run Code Online (Sandbox Code Playgroud)
但在ES6中它将是:
3.14
3
4
5
Run Code Online (Sandbox Code Playgroud)
我想知道为什么ES6允许更改const值,问题是为什么我们现在应该使用'const'?我们可以使用'let'代替吗?
注意:jsbin可用于测试,选择JavaScript运行ES5代码,Traceur运行ES6功能.
TL; DR:
我们是否需要原型OO中的工厂/施工人员?我们可以做一个范例切换并完全删除它们吗?
BackStory:
我最近一直在玩JavaScript中的原型OO并发现在JavaScript中完成的99%的OO正在强制使用经典的OO模式.
我对原型OO的看法是它涉及两件事.方法(和静态数据)的静态原型和数据绑定.我们不需要工厂或建造者.
在JavaScript中,这些是包含函数和的对象文字Object.create.
这意味着我们可以将所有内容建模为静态蓝图/原型和数据绑定抽象,最好直接连接到文档样式的数据库中.即,从数据库中取出对象,并通过使用数据克隆原型来创建对象.这意味着没有构造函数逻辑,没有工厂,没有new.
示例代码:
一个伪示例是:
var Entity = Object.create(EventEmitter, {
addComponent: {
value: function _addComponent(component) {
if (this[component.type] !== undefined) {
this.removeComponent(this[component.type]);
}
_.each(_.functions(component), (function _bind(f) {
component[f] = component[f].bind(this);
}).bind(this));
component.bindEvents();
Object.defineProperty(this, component.type, {
value: component,
configurable: true
});
this.emit("component:add", this, component);
}
},
removeComponent: {
value: function _removeComponent(component) {
component = component.type || component;
delete this[component];
this.emit("component:remove", this, component);
}
}
}
var entity = Object.create(Entity, toProperties(jsonStore.get(id)))
Run Code Online (Sandbox Code Playgroud)
小解释:
特定代码很冗长,因为ES5很冗长. …
ecmascript-5 ×10
javascript ×10
strict-mode ×3
ecma262 ×2
ecmascript-6 ×2
eval ×1
node.js ×1
oop ×1
polyfills ×1