我不确定我是否做对了.
这个例子直接来自MDN(Mozilla Developer Network):
var bValue;
Object.defineProperty(o, "b", {get : function(){ return bValue; },
set : function(newValue){ bValue = newValue; },
enumerable : true,
configurable : true});
Run Code Online (Sandbox Code Playgroud)
会发生什么 - 它创建了一个名为bValue的全局变量,但未完成.我知道这个例子只展示了它的使用,因此它可以创建一个全局变量.但是,如果我要在应用程序中使用它,我将通过添加this关键字稍微修改它:
Object.defineProperty(o, "b", {get : function(){ return this.bValue; },
set : function(newValue){ this.bValue = newValue; },
enumerable : true,
configurable : true});
Run Code Online (Sandbox Code Playgroud)
现在,该对象o将具有属性b,同时它还将具有另一个属性bValue.用户(程序员)将仅暴露于'b'而不是'bValue',尽管他仍然可以直接访问bValue - 我看不出它是如何被阻止的.
我理解属性b和属性bValue可能并不总是相同,但b取决于值,bValue因为getter和setter允许我们在赋值之前预处理bValue b.
主要问题是,我做对了吗?或者我在这里遗漏了什么?
Math对象没有prototype属性,但具有构造函数属性.有没有重新定义构造函数有用的情况?
请考虑以下代码段:
var global = (function(){
return this;
}());
Run Code Online (Sandbox Code Playgroud)
当执行global时将指向window浏览器中的对象.
但这在严格模式下不起作用.为什么?
我在jshint中得到这个,
[L16:C13] W034:不必要的指令"use strict".
不过我的问题是做这样的工作..
function () {
"use strict";
var a = function () {
//stuff, (is this also strict)
}
}
Run Code Online (Sandbox Code Playgroud)
将东西严格吗?显然,严格声明之外的事情并不严格.但是其他函数内部是否开始非严格或继承严格性?
在JavaScript函数中,arguments是一个类似于数组的对象,包含函数的所有参数,无论它们是否被命名:
function f(foo, bar) {
console.log(arguments);
}
f(1, '2', 'foo'); // [1, "2", "foo"]
Run Code Online (Sandbox Code Playgroud)
有没有办法只获取未命名的参数,所以你可以做这样的事情?
function f(foo, bar) {
console.log('foo:', foo, 'bar:', bar, 'the rest:', unnamedArguments);
}
f(1, '2', 'foo'); // foo: 1 bar: "2" the rest: ["foo"]
Run Code Online (Sandbox Code Playgroud)
一个真实的用例是将Angular模块作为参数注入RequireJS模块:
define([
'angular',
'myLibModule', // Exports an Angular module object
'myOtherLibModule', // Exports an Angular module object
], function(angular, myLibModule, myOtherLibModule) {
angular.module('MyApp', [myLibModule.name, myOtherLibModule.name]);
});
Run Code Online (Sandbox Code Playgroud)
由于模块依赖关系列表可能会非常大,因此很快变得非常麻烦.虽然我可以解决它
define([
'angular',
'underscore',
'myLibModule', // Exports an Angular module object …Run Code Online (Sandbox Code Playgroud) 最小例子:
function test() {
console.log(arguments.join(','));
}
test(1,2,3);
Run Code Online (Sandbox Code Playgroud)
然后我得到:
TypeError:undefined不是函数
但是,当我对数组执行相同操作时:
console.log([1,2,3].join(','));
Run Code Online (Sandbox Code Playgroud)
我明白了
"1,2,3"
正如所料.
这个问题有什么不对?它假设是一个数组:
(function () {
console.log(typeof [] == typeof arguments)
})();
Run Code Online (Sandbox Code Playgroud)
真正
我有一个对象,我作为参数传递给函数.在该函数内部我想为它赋予一个不同的值,但是因为在函数内部我们只引用了原始对象,所以我们不能使用简单赋值=.
在ES2015中,我可以使用Object.assign
除了将属性复制到引用之外,是否有我可以在ES5中使用的解决方法?
以下是https://jsbin.com/wimuvaqosi/1/edit?js,console的示例
var x = {prop:1};
function foo(x1) {
var y = {prop:2};
x1 = y; //this obviously does not work
//x1 = Object.assign(x1, y); //this works only in ES2015
}
foo(x);
console.log("x ", x);
Run Code Online (Sandbox Code Playgroud) 现在,如果您遵循自定义元素spec的v1的确切规范,则不可能在不支持类的浏览器中使用自定义元素。
有没有一种方法可以创建v1自定义元素而不使用类语法,以使它们在Chrome,FireFox和IE11中完全起作用。另外,由于IE11不对自定义元素提供本机支持,所以我假设我们可能需要使用一些pollyfills,那么,为了在IE11中实现此功能,我们需要哪些polyfills或库?
我已经弄乱了Polymer 2,Polymer 3和Stencil,但是它们对于我们要创建的某些东西来说有点繁重。
这个问题似乎是在正确的轨道上,但是让它在IE11中工作时遇到了一些麻烦,因此,如何才能在IE11中使用Reflect.construct来实现自定义元素?
我已经尝试过babel转换器,它将All let,const和var转换为var,所以总的来说,我们的代码使用有什么不同?
我已经读过文件了,我知道let,const和var之间的区别是什么,但是如果所有这些文件最终都转换为var,那有什么区别?这意味着在性能甚至范围上不应该有任何有意义的差异!
更新(02.14.2019):根据我的理解,范围确实很重要,即使它们被转换为var,babel仍保留范围的含义.我的问题仍然是性能,是否有任何有意义的性能差异?
我附加了转换器的输入和输出,以及更复杂的场景
输入:
let a = 1;
for (let a = 0; a !== 0;) {
for (let a = 0; a !== 0;) {}
}
Run Code Online (Sandbox Code Playgroud)
产量
"use strict";
var a = 1;
for (var _a = 0; _a !== 0;) {
for (var _a2 = 0; _a2 !== 0;) {}
}
Run Code Online (Sandbox Code Playgroud) javascript javascript-objects ecmascript-5 ecmascript-6 babeljs
我正在尝试将以下函数转换为JavaScript中的类(来自此处创建的CMS的原始函数),
function Countdown(options) {
var timer,
instance = this,
seconds = options.seconds || 10,
updateStatus = options.onUpdateStatus || function () {},
counterEnd = options.onCounterEnd || function () {};
function decrementCounter() {
updateStatus(seconds);
if (seconds === 0) {
counterEnd();
instance.stop();
}
seconds--;
}
this.start = function () {
clearInterval(timer);
timer = 0;
seconds = options.seconds;
timer = setInterval(decrementCounter, 1000);
};
this.stop = function () {
clearInterval(timer);
};
}
Run Code Online (Sandbox Code Playgroud)
通过这种用法,
var myCounter = new Countdown({
seconds:5, // number …Run Code Online (Sandbox Code Playgroud) ecmascript-5 ×10
javascript ×10
actionscript ×1
babeljs ×1
constructor ×1
ecmascript-6 ×1
get ×1
jscript ×1
node.js ×1
set ×1
v8 ×1