考虑到Chrome主要版本尚未发布,Chrome Canary 59 的新型Ignition + Turbofan引擎已经解决了这个问题.测试显示相同的时间let和var声明的循环变量.
原始(现在是静音)问题.
当使用let在forChrome上循环运行速度非常缓慢,相比于移动变量外刚内循环的范围.
for(let i = 0; i < 1e6; i ++);
Run Code Online (Sandbox Code Playgroud)
需要两倍的时间
{ let i; for(i = 0; i < 1e6; i ++);}
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?
Snippet演示了差异,只影响Chrome,只要我记得Chrome支持,就一直如此let.
var times = [0,0]; // hold total times
var count = 0; // number of tests
function test(){
var start = performance.now();
for(let i = 0; i < 1e6; i += 1){};
times[0] += performance.now()-start;
setTimeout(test1,10) …Run Code Online (Sandbox Code Playgroud)我经常遇到以下情况:假设我有这三个功能
def firstFn: Int = ...
def secondFn(b: Int): Long = ...
def thirdFn(x: Int, y: Long, z: Long): Long = ...
Run Code Online (Sandbox Code Playgroud)
我也有calculate功能.我的第一种方法可能如下所示:
def calculate(a: Long) = thirdFn(firstFn, secondFn(firstFn), secondFn(firstFn) + a)
Run Code Online (Sandbox Code Playgroud)
它看起来很漂亮,没有任何花括号 - 只有一个表达式.但它不是最佳的,所以我最终得到了这个代码:
def calculate(a: Long) = {
val first = firstFn
val second = secondFn(first)
thirdFn(first, second, second + a)
}
Run Code Online (Sandbox Code Playgroud)
现在有几个用大括号括起来的表达式.在这样的时刻,我羡慕Clojure一点点.使用let函数我可以在一个表达式中定义此函数.
所以我的目标是calculate用一个表达式定义函数.我想出了两个解决方案.
1 - 使用scalaz我可以像这样定义它(有更好的方法用scalaz做到这一点吗?):
def calculate(a: Long) =
firstFn |> {first => secondFn(first) |> {second => …Run Code Online (Sandbox Code Playgroud) 是否有一个类似于Haskell'let'表达式的Python,它可以让我写出如下内容:
list2 = [let (name,size)=lookup(productId) in (barcode(productId),metric(size))
for productId in list]
Run Code Online (Sandbox Code Playgroud)
如果没有,最可读的替代方案是什么?
添加以澄清let语法:
x = let (name,size)=lookup(productId) in (barcode(productId),metric(size))
Run Code Online (Sandbox Code Playgroud)
相当于
(name,size) = lookup(productId)
x = (barcode(productId),metric(size))
Run Code Online (Sandbox Code Playgroud)
但是,第二个版本与列表推导不太相配.
在Clojure,
(def x 3)
(eval '(prn x))
Run Code Online (Sandbox Code Playgroud)
打印3,而
(let [y 3]
(eval '(prn y)))
Run Code Online (Sandbox Code Playgroud)
和
(binding [z 3] (eval '(prn z)))
Run Code Online (Sandbox Code Playgroud)
生成'无法解析var'异常.
据http://clojure.org/evaluation,eval,load-string,等生成临时命名空间来评估它们的内容.因此,我希望上述代码示例都不起作用,因为(def x 3)它是在我当前的命名空间中完成的,而不是由当前命名空间创建的eval.
eval使用绑定变量的表单而不使用def?谢谢!
已过时
let语句的块版本在最终确定之前从ES6中删除,并且已从支持它的浏览器中删除.这个问题现在只具有历史意义.
使用ECMAScript 6 let块语句和使用with具有等效对象文字的语句之间有什么区别吗?
let声明var x = 10;
let (x = x * 10,
y = x + 5) {
console.log("x is " + x + ", y is " + y);
}
Run Code Online (Sandbox Code Playgroud)
with声明var x = 10;
with ({x: x * 10,
y: x + 5}) {
console.log("x is " + x + ", y is " + y);
// writes "x is 100, y is 15"
}
Run Code Online (Sandbox Code Playgroud) javascript language-features let with-statement ecmascript-6
编辑:我已将此报告为Chromium错误:https://bugs.chromium.org/p/chromium/issues/detail? id = 668257
我在JS中用可以射击的敌人创建一个小帆布游戏.为了测试,我创建了一个全局声明的标志,let fancy = true;以确定是否使用"花式"定位算法.我这样按下P就会切换这个标志.我的主要功能,每秒frame调用另一个函数autoShoot,五次.autoShoot使用fancy旗帜.
今天,奇怪的事情开始发生了; 我不记得引入了什么变化.有时,当我按下P时,autoShoot表现得像fancy是没有被切换.我做了一些调试和发现新的触发值是反映内frame,但autoShoot不更新的价值.它间歇性地发生,有时它的价值autoShoot会自行解决(没有我做过任何事情).
我把代码减少到了以下,这对我来说仍然存在问题.尝试多次按P.对我来说,两个值"不同步"并在按P一次或两次后显示不同:
(我在Windows 10上运行Chrome"Version 54.0.2840.99 m".)
const canvas = document.getElementById("c");
const width = 0;
const height = 0;
const ctx = canvas.getContext("2d");
const ratio =1;// (window.devicePixelyRatio||1)/(ctxFOOOOOOOOFOOOOOOOOOFOOOOO||1);
canvas.width = width*ratio;
canvas.height = height*ratio;
canvas.style.width = width+"px";
canvas.style.height = height+"px";
ctx.scale(ratio, ratio);
function testSet(id, val) {
console.log(id+": …Run Code Online (Sandbox Code Playgroud)javascript google-chrome let requestanimationframe ecmascript-6
我有一个问题应该相当简单,但我还没有找到解决方案.我正在编辑我的.vimrc,并希望使用保存在变量中的结果设置一个选项.例如,我想在〜/ .vimetc中聚合我的所有临时文件.这就是我想做的事情,
let s:vimetc=$HOME.'/vimetc/'
set backupdir=s:vimetc.'backups/'
set directory=s:vimetc.'vimswap/'
set viewdir=s:vimetc.'vimswap/'
Run Code Online (Sandbox Code Playgroud)
当然,set不解析变量,所以我最终得到了文字| s:vimetc.'backups /'|,而不是我想要的.我尝试使用&s:vimetc,但结果相似.有谁知道如何做到这一点?
我知道为什么const在for循环中不起作用.我们需要创建一个新的范围并将值复制到其中.所以这不会飞.
for(const i = 0; i < 5; i++) console.log(i);
Run Code Online (Sandbox Code Playgroud)
虽然这样会.
for(let i = 0; i < 5; i++) console.log(i);
Run Code Online (Sandbox Code Playgroud)
但是,我注意到它们在循环通过像这样的对象的属性时工作.
for(let property in thingy) console.log(property);
for(const property in thingy) console.log(property);
Run Code Online (Sandbox Code Playgroud)
我不知道为什么.
在一个let形式(Clojure在这里)我可以做类似的事情
(let [[u s v] (svd A)]
(do-something-with u v))
Run Code Online (Sandbox Code Playgroud)
其中svd返回长度为3的列表.这是一件很自然的事情,为什么我们不这样做呢?
(def [u s v] (svd A))
Run Code Online (Sandbox Code Playgroud)
及其各种概括作为def表单的默认行为?我不知道这会如何干扰def已经在做的事情.理解Lisp或Clojure的Zen的人能解释为什么def不支持绑定(与解构)一样强大let吗?