ECMAScript 6介绍了该let声明.我听说它被描述为"本地"变量,但我仍然不太确定它与var关键字的行为有何不同.
有什么区别?何时应该let使用var?
我理解为什么var采用这个名字 - 它是变量的,const- 它是一个常量,但名称背后的含义是什么let,它的范围是当前的块?随它去?
我已经玩ES6一段时间了,我注意到虽然声明的变量var按预期提升了......
console.log(typeof name); // undefined
var name = "John";
Run Code Online (Sandbox Code Playgroud)
... 用吊装声明let或const似乎有一些问题的变量:
console.log(typeof name); // ReferenceError
let name = "John";
Run Code Online (Sandbox Code Playgroud)
和
console.log(typeof name); // ReferenceError
const name = "John";
Run Code Online (Sandbox Code Playgroud)
这是否意味着变量声明let或未声明const?这是怎么回事?这个问题let和const这个问题有什么区别吗?
我听说在初始化之前访问let和const值可能会导致ReferenceError因为称为时间死区的东西.
什么是暂时死区,它与范围和吊装有什么关系,以及在什么情况下遇到?
我是Haskell的新手,我对Where vs. Let感到非常困惑.它们似乎都提供了类似的目的.我已经阅读了Where与Let之间的一些比较,但我无法辨别何时使用每个.有人可以提供一些上下文或者一些示例,说明何时使用其中一个?
哪里与让
甲
where子句只能在一个函数定义的电平来定义.通常,这与let定义的范围相同.唯一的区别是使用警卫时.该where条款的范围扩展到所有警卫.相反,let表达式的范围只是当前的函数子句和guard,如果有的话.
该哈斯克尔维基是非常详细,并提供各种案件,但它使用的假设的例子.我觉得它的解释对初学者来说太简短了.
让我们的优势:
f :: State s a
f = State $ \x -> y
where y = ... x ...
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为where指的是模式匹配f =,其中没有x在范围内.相比之下,如果你开始使用let,那么你就不会遇到麻烦了.
f :: State s a
f = State $ \x ->
let y = ... x ...
in y
Run Code Online (Sandbox Code Playgroud)
其中的优点:
f x
| cond1 x = a
| cond2 …Run Code Online (Sandbox Code Playgroud) Java编译器似乎支持(寻找)let表达式.com.sun.tools.javac.tree.*LetExpr
JCTree中的一条评论甚至提到了一些语法
(let int x = 3; in x+2)
Run Code Online (Sandbox Code Playgroud)
这当然不被语言的语法所接受,并在早期的编译阶段被拒绝.
我想知道这个构造的起源,这是我以前从未见过的.
它javac是由内部使用还是由其他工具合成?它可能只是Java早期的一件神器,它的语言功能从未见过光明吗?
今天有什么有用的东西吗?
一般来说,它为什么存在?
我知道它们是不同的,因为一个用于设置*compile-path*,一个不用.但是,我需要帮助他们为什么不同.
let使用给定的绑定创建一个新的范围,但是binding......?
无论功能差异如何,使用新关键字"let"和"const"对"var"的性能有任何广义或特定的影响吗?
运行程序后:
function timeit(f, N, S) {
var start, timeTaken;
var stats = {min: 1e50, max: 0, N: 0, sum: 0, sqsum: 0};
var i;
for (i = 0; i < S; ++i) {
start = Date.now();
f(N);
timeTaken = Date.now() - start;
stats.min = Math.min(timeTaken, stats.min);
stats.max = Math.max(timeTaken, stats.max);
stats.sum += timeTaken;
stats.sqsum += timeTaken * timeTaken;
stats.N++
}
var mean = stats.sum / stats.N;
var sqmean = stats.sqsum / stats.N;
return {min: stats.min, max: stats.max, mean: mean, …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我可以把最后一个词放在in前面.它会改变什么吗?
另一个问题:如果我决定放在in最后一个短语的前面,我是否需要缩进它?
我试着没有缩进和拥抱抱怨
do {...}中的最后一个生成器必须是表达式
import Data.Char
groupsOf _ [] = []
groupsOf n xs =
take n xs : groupsOf n ( tail xs )
problem_8 x = maximum . map product . groupsOf 5 $ x
main = do t <- readFile "p8.log"
let digits = map digitToInt $concat $ lines t
print $ problem_8 digits
Run Code Online (Sandbox Code Playgroud)
好的,所以人们似乎不明白我在说什么.让我重新说一下:鉴于上述背景,以下两个是否相同?
1.
let digits = map digitToInt $concat $ lines t
print $ problem_8 digits
Run Code Online (Sandbox Code Playgroud)
2.
let …Run Code Online (Sandbox Code Playgroud) 我想对Swift中的一些属性使用Lazy初始化.我当前的代码如下所示:
lazy var fontSize : CGFloat = {
if (someCase) {
return CGFloat(30)
} else {
return CGFloat(17)
}
}()
Run Code Online (Sandbox Code Playgroud)
问题是,一旦设置了fontSize,它将永远不会改变.所以我想做这样的事情:
lazy let fontSize : CGFloat = {
if (someCase) {
return CGFloat(30)
} else {
return CGFloat(17)
}
}()
Run Code Online (Sandbox Code Playgroud)
这是不可能的.
只有这个有效:
let fontSize : CGFloat = {
if (someCase) {
return CGFloat(30)
} else {
return CGFloat(17)
}
}()
Run Code Online (Sandbox Code Playgroud)
所以 - 我想要一个延迟加载但永远不会改变的属性.这样做的正确方法是什么?使用let和忘记懒惰的初始化?或者我应该使用lazy var并忘记属性的恒定性质?
let ×10
javascript ×5
ecmascript-6 ×4
const ×3
haskell ×2
scope ×2
var ×2
binding ×1
clojure ×1
hoisting ×1
java ×1
keyword ×1
performance ×1
swift ×1
v8 ×1
where ×1
where-clause ×1
whitespace ×1