我刚读完一篇关于ECMAScript 5严格模式的文章.
它说ECMAScript 5添加了.bind().
var obj = {
method: function(name){
this.name = name;
}
};
obj.method.bind(obj,"hello");
Run Code Online (Sandbox Code Playgroud)
是不是与obj.method.call(obj,"你好")相同?
我无法回想起if语句的规则,所以我查看了第12.5节,但是如果大括号是必要的话,我仍然不明白.所以,我想问一下,在Ecmascript 5.1中,提到if语句中没有左大括号是可以接受的吗?
null是保留字但不是关键字.
因此它不能被覆盖.
undefined是一个内置的全局,可以覆盖.这就是为什么你看到jQuery在其IIFE中重新定义它的原因.只是为了确保它没有被覆盖.
什么时候使用ES 5中指定的技术区别是什么.
我知道我已经看到浏览器根据浏览器将未创建的localStorage属性设置为null或undefined.
localStorage.not_defined === null // sometimes
localStorage.not_defined === undefined // sometimes
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ES 5如何指定它们的用法?
ES5未作澄清:
8.1未定义类型未定义类型只有一个值,称为undefined.未分配值的任何变量都具有未定义的值.
8.2 Null类型Null类型只有一个值,称为null.
http://www.ecma-international.org/publications/standards/Ecma-262.htm
由于JavaScript变得越来越流行,我想知道谁是决定语言的人是谁,为什么我们有ECMAScript而不是JavaScript?ECMA网站看起来非常过时......这些负责网络未来的人是否能够驱动V8和NodeJ等所有常规内容?
我喜欢JavaScript,我喜欢NodeJs ...但似乎对最新的脚本语言有什么争议.我猜这是无法避免的.我对JavaScript的未来感到兴奋,并希望我们掌握得很好.
我的揭示模块中有以下代码,但我不确定如何声明/定义imageListItem,这严格来说是一个 DTO,并不真正需要任何信息隐藏。我是否正确定义了这个对象?
var imageListItem = function() {
var _title;
Object.defineProperty(this, "title", {
get: function () { return _title; },
set: function (value) { _title = value; }
}
);
};
var imageList = (function () {
var buffer = new CBuffer();
return {
populate: function (listItems) {
buffer.push(listItems);
},
rotate: function() {
buffer.rotateLeft();
}
}
})();
Run Code Online (Sandbox Code Playgroud)
使用imageListItem,我想声明一个对象结构以供以后使用。该声明在逻辑上不应依赖于该对象以后将如何使用。也就是说,我不想发现自己imageListItem意外地动态分配新属性或从中删除属性。对属性的任何分配都应该严格仅分配给已经在对象上声明的属性。
Object.freeze() 通过防止添加或删除属性几乎实现了这一点,但它也防止了属性被更改。
例如我想要这个:
var obj = {
prop: function() {},
foo: 'bar'
};
// New properties may …Run Code Online (Sandbox Code Playgroud) 我正在Javascript 上观看Crockford - 第三幕:在大约 41 分 26 秒时发挥终极作用。他屏幕上的代码arguments.slice()以一种导致我出错的方式使用。
function curry(func){
var args = arguments.slice(1);
...
}
Run Code Online (Sandbox Code Playgroud)
他是这样解释的:
我将首先得到一个参数数组,除了第一个,因为第一个是一个函数,我不需要那个。在这种情况下,我假设我在 ES5 上,所以我没有做可怕的
Array.prototype.apply()把戏。
问题是运行会arguments.slice()导致此错误:
Uncaught TypeError: arguments.slice is not a function
我正在测试肯定有 ES5 的现代浏览器!我可以让代码工作的唯一方法是,如果我使用一些“可怕的”技巧,(如他所称),例如Array.prototype.slice.apply(arguments, [1])或[].slice.call(arguments, 1);.
他只是误会了吗?他的幻灯片有错别字吗?为什么arguments.slice()在我的 ES5 浏览器中不起作用?
我想为.toJson实例化的JavaScript对象添加一个方法,这将允许我获取没有函数和原型的字符串化对象实例,以便在请求期间进行传输.
但是,似乎函数'toJSON'的实际名称作为方法名称会影响JavaScript引擎(至少在V8中)运行该函数的能力 - 也就是说,如果您将相同的精确函数重命名为"JSON"但是,"toJSON"的工作原理是"toJSON",它会导致最大Callstack错误.见例子:
function P1(name, age){
this.name = name;
this.age= age;
this.toJSON = function(){
return JSON.stringify(this);
}
}
function P2(name, age){
this.name = name;
this.age= age;
this.JSON = function(){
return JSON.stringify(this);
}
}
// This causes an error: Uncaught RangeError: Maximum call stack size exceeded(…)
var p1 = new P1('Memory Error', 10);
try {
p1.toJSON();
} catch(e){
console.log(e);
}
var p2 = new P2('No Error', 20);
p2.JSON();
Run Code Online (Sandbox Code Playgroud)
这是JavaScript的预期行为吗?是否与"toJSON"作为本机方法有关(注意:我已经在上面的实例化对象上验证了原型上没有可能干扰实例重新定义的toJSON方法)?我试图确定我是否应该将此报告为V8团队的错误,或者这可以由了解规范的人解释.
谢谢
我尝试使用es6-promiseTypeScript 2.1.1定位ES5和webpack.
app.ts
import "es6-promise/auto";
export class Foo {
bar() : Promise<string>{
return Promise.resolve("baz");
}
}
Run Code Online (Sandbox Code Playgroud)
webpack.common.js
const path = require('path');
var webpack = require('webpack');
module.exports = {
entry: {
'app': './app.ts',
},
output: {
path: 'dist/ie',
filename: '[name].js'
},
resolve: {
extensions: ['', '.ts', '.js']
},
devtool: 'source-map',
module: {
loaders: [
{
test: /\.ts$/,
loaders: ['awesome-typescript-loader']
},
]
},
plugins: [
new webpack.ProvidePlugin({
Promise: 'imports?this=>global!exports?global.Promise!es6-promises'
}),
]
};
Run Code Online (Sandbox Code Playgroud)
的package.json
{
"name": "foo",
"ieArtifactName": "foo",
"version": "3.0.0-1", …Run Code Online (Sandbox Code Playgroud) 我正在选择一个元素,我需要根据某些规则更改元素的大小,所有这些在主要浏览器中都可以正常工作,但在 ie11/Edge 中它不起作用。
this.visContainer = this.$element[0].querySelector('.am-visualization-render-area__vis-container');
Run Code Online (Sandbox Code Playgroud)
这是出错的地方我试图将值设置为只读属性
const visContainerBounds = this.visContainer.getBoundingClientRect();
visContainerBounds.width -= this.marginHorizontal;
visContainerBounds.height -= this.marginVertical;
Run Code Online (Sandbox Code Playgroud)
这将返回错误
严格模式下不允许分配给只读属性
我也试过
this.visContainer.clientWidth -= this.marginHorizontal;
this.visContainer.clientHeight -= this.marginVertical;
const visContainerBounds = this.visContainer.getBoundingClientRect();
Run Code Online (Sandbox Code Playgroud)
现在根据我的发现,这是由 ie 和 edge 遵循 ECMAScript5 标准引起的,而 chrome ff safari 不在这种情况下。
我的问题是如何在不抛出此错误的情况下设置元素宽度的值?任何帮助表示赞赏。
我需要重复async / await块几次,但是不能使用以下代码:
for (let i = 0; i <= 10; i += 1) {
const res = await DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
因为它与不等待循环规则相矛盾。
ecmascript-5 ×10
javascript ×9
async-await ×2
bind ×1
call ×1
ecmascript-3 ×1
function ×1
json ×1
node.js ×1
promise ×1
typescript ×1
v8 ×1
webpack ×1