请考虑下面的片段-
for(let i = 1; i <= 5; i++) {
setTimeout(function(){
console.log(i);
},100);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,内部的日志setTimeout将包含i每个 for 循环迭代的变量值,即日志如下
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
为此,我已经阅读了 Internet 上的解释,例如 -let为每个循环创建一个变量声明,这是块级声明。所以基本上它在{ }.
但我对这个说法有点困惑。如果let为每个循环创建一个变量声明,它不会总是1按照循环初始化语句进行初始化let i=1吗?此外,变量i在循环块外声明、初始化和递增,即for循环语句中的花括号。那么,在每次迭代中,不是i增加和使用相同的变量吗?究竟如何let为每个循环创建一个变量声明并具有前一次迭代的值?
我检查了有关同一问题的问题和答案,但没有一个回答我的问题,所以请不要丢弃我的问题。
当“i”被声明为 let 变量时,对于每次迭代,JS 都会创建一个新的“i”绑定,因此 SetTimout 的每个函数在其闭包内都有自己的“i”(与“i”的情况相反)被声明为 var 变量,其中所有 SetTimout 函数在其闭包中共享相同的绑定)。问题是:如果 JS 在使用 let 时在 for 循环的每次迭代中创建一个新的“i”绑定,那么增量值如何传输到 i 的新绑定?
i 的新绑定如何用 i 的当前值实例化?
我们是否真的在不同范围内有两个具有不同值的 i 绑定(如果是),这些范围是什么?
提前致谢
function a() {
for (let i = 0; i < 3; i++) {
setTimeout(function () { console.log(i) }, i * 1000);
}
}
a();Run Code Online (Sandbox Code Playgroud)
引自《JavaScript: The Definitive Guide》一书
与用
let声明的变量不同,用 多次声明同一个变量是合法的var。并且由于var变量具有函数作用域而不是块作用域,因此进行这种重新声明实际上很常见。该变量i经常用于整数值,特别是作为 for 循环的索引变量。在具有多个 for 循环的函数中,通常每个循环都开始for(var i = 0;......因为var这些变量的范围不限于循环体,所以这些循环中的每一个都(无害地)重新声明和重新初始化相同的变量。
我无法理解这一段的意思。首先,我假设以下不会与不迭代的第二个循环一起工作,因为i将是函数作用域:
(function foo() {
for (let i = 0; i < 2; i++) {
console.log(i);
}
for (let i = 0; i < 2; i++) {
console.log(i);
}
})();
Run Code Online (Sandbox Code Playgroud)
但它打印
0
1
0
1
Run Code Online (Sandbox Code Playgroud)
然后我假设这会打印0 0 1 1 0 1,但事实并非如此:
0
1
0
1
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解什么意思吗
在多个for循环的函数中,
var可以在每个循环中无害地使用
和它有什么不同 …
在Lisp中(我仍在使用SBCL学习Lisp),声明了局部变量let,范围仅在该表达式中.这是为什么?与其他命令式语言(如C/C++/Java ...)不同,我们可以在其功能范围内的任何位置自由使用局部变量.
尝试运行代码时,我不断收到此错误:
(let ((exp lambda (x y) (if (= y 1) x (* (exp x (- y 1)) x)))))
Run Code Online (Sandbox Code Playgroud)
错误:
let: bad syntax in: (let ((exp lambda (x y) (if (= y 1) x (* (exp x (- y 1)) x)))))
Run Code Online (Sandbox Code Playgroud)
我的函数应该定义递归取幂,但我遇到let问题.
所以我是Haskell的新手,我必须编写Rabin Karps算法.我觉得我的答案应该可以工作,但是当我编译时,我仍然会在"let'"错误中出现"解析错误".有人可以帮帮我吗
这是我的代码:
import Data.Char
hash :: String -> Int
hash [] = -1
hash (x:xs) = ((ord x))
rabinKarp :: String -> String -> Bool
rabinKarp [] _ = False
rabinKarp mainString patternString
let
hashPattern = hash patternString
hashMain = hash (take (length pattern) mainString)
if hashPattern == hashMain
then True
else rabinKarp (drop 1 mainString) patternString
Run Code Online (Sandbox Code Playgroud) 在swift中,let如果变量在初始化后没有改变,建议用关键字声明变量.我看到很多变量被声明为let.
在java中,我认为关键字final可以起到同样的作用.但是根据我有限的经验,我只看到人们final在极少数情况下声明变量,例如PI.
为什么Java变量不final经常被声明?有什么我想念的吗?
我知道这有效:
do name <- getLine; let nameTag = "Hello, my name is " ++ name in putStrLn nameTag
Run Code Online (Sandbox Code Playgroud)
加载到GHCI时,这段代码也是如此:
hey = do
name <- getLine
let nameTag = "Hello, my name is " ++ name
putStrLn nameTag
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
do name <- getLine; let nameTag = "Hello, my name is " ++ name; putStrLn nameTag
Run Code Online (Sandbox Code Playgroud)
给出以下错误消息:
<interactive>:142:82:
parse error (possibly incorrect indentation or mismatched brackets)
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?我可以让它运作吗?如果是,那怎么样?
我在全局范围内创建了一个navigator变量,并使用let关键字为其分配一个字符串.
// in a browser
let navigator = "Hello!";
console.log(navigator ); // "Hello!"
console.log(window.navigator === navigator ); // false
Run Code Online (Sandbox Code Playgroud)
这里的let navigator价值影响了window.navigator.但我很好奇知道let navigator存储的确切位置?
在一个cellForRowAtIndexPath我有:
if let imageView = cell.viewWithTag(SOME_TAG) as? UIImageView
{
// Nothing to do here.
}
else
{
// Add image view to cell.
}
Run Code Online (Sandbox Code Playgroud)
但我只需要else块。有没有办法反转if let xyz =?
(我知道我可以将它分解成一个if imageView == nil。)
刚刚发现了类似的问题。
let ×10
javascript ×4
ecmascript-6 ×2
haskell ×2
lisp ×2
scope ×2
swift ×2
var ×2
variables ×2
final ×1
for-loop ×1
ghci ×1
if-statement ×1
java ×1
rabin-karp ×1
recursion ×1
syntax ×1