标签: ecmascript-5

我可以为特定功能禁用ECMAscript严格模式吗?

我在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";的顶部,但有没有办法实现相反的目的?

javascript ecma262 ecmascript-5 strict-mode

70
推荐指数
2
解决办法
4万
查看次数

有没有办法检查是否强制执行严格模式?

无论如何都要检查是否强制执行严格模式'use strict',并且我们想要为严格模式执行不同的代码,而为非严格模式执行其他代码.寻找像这样的功能isStrictMode();//boolean

javascript ecma262 ecmascript-5 strict-mode

68
推荐指数
6
解决办法
1万
查看次数

"锁定"JavaScript对象的任何性能优势?

JavaScript 1.8.5(ECMAScript 5)添加了一些有趣的方法,可以防止将来修改传递的对象,具有不同程度的彻底性:

据推测,这些问题的关键在于捕获错误:如果您知道在某个点之后不想修改对象,则可以将其锁定,以便在以后无意中尝试修改时会抛出错误.("use strict";假设你已经完成了.)

我的问题:在现代JS引擎(如V8)中,使用上述方法锁定对象时是否有任何性能优势(例如,更快的属性查找,减少内存占用)?

(另请参阅John Resig的好解释 - 但不提及性能.)

javascript ecmascript-5 javascript-1.8

66
推荐指数
4
解决办法
1万
查看次数

你什么时候使用Object.defineProperty()

我想知道什么时候应该使用

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()的相当冗长的调用以及出于什么原因时,我实际上更好奇.

javascript ecmascript-5

61
推荐指数
6
解决办法
1万
查看次数

动态设置嵌套对象的属性

我有一个对象,可以是任意数量的级别,可以有任何现有的属性.例如:

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)

我怎么才能实现这样的功能呢?

javascript ecmascript-5

59
推荐指数
9
解决办法
5万
查看次数

在严格模式下间接评估

我理解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代码的执行上下文时,执行以下步骤:

  1. 如果没有调用上下文或者eval代码没有通过直接调用(15.1.2.1.1)评估到eval函数那么,

    一个.将执行上下文初始化为使用eval代码作为C的全局执行上下文,如10.4.1.1中所述.

  2. 其他,

    一个.将ThisBinding设置为与调用执行上下文的ThisBinding相同的值.
    湾 将LexicalEnvironment设置为与调用执行上下文的LexicalEnvironment相同的值. …

javascript eval ecmascript-5

51
推荐指数
1
解决办法
5703
查看次数

为什么在Javascript5严格模式下不允许删除?

我对javascript很新,但我很喜欢它的危险快速和松散的表现力.也就是说,我注意到显然在"使用严格"模式下操作时,您无法删除对象.我不是一个删除东西的忠实粉丝(因为从理论上讲,范围应该照顾到这一点),但我想知道删除这个功能背后的动机是什么?

javascript ecmascript-5 strict-mode

49
推荐指数
2
解决办法
3万
查看次数

Shim vs. Sham:有什么区别?

假垫片和假牙有什么区别?

是否足以包含es5-shim.min.js和es6-shim.min.js,还是应该包括es5-sham.min.js和es6-sham.min.js?

javascript ecmascript-5 polyfills ecmascript-6

49
推荐指数
1
解决办法
1万
查看次数

'let'和'const'ECMAScript 2015(ES6)有什么区别?

我不知道是什么样的区别let,并constES6.它们都是块作用域,如以下代码中的示例所示:

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功能.

javascript ecmascript-5 ecmascript-6

46
推荐指数
5
解决办法
3万
查看次数

JavaScript中的原型OO

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很冗长. …

javascript oop prototypal-inheritance node.js ecmascript-5

43
推荐指数
2
解决办法
4462
查看次数