标签: let

JavaScript:了解 for 循环内的 let 作用域

请考虑下面的片段-

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为每个循环创建一个变量声明并具有前一次迭代的值?

javascript scope for-loop let ecmascript-6

2
推荐指数
2
解决办法
1394
查看次数

在 JavaScript for 循环中设置变量

我检查了有关同一问题的问题和答案,但没有一个回答我的问题,所以请不要丢弃我的问题。

当“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 var let

2
推荐指数
1
解决办法
2088
查看次数

在具有多个循环的函数中使用 var?

引自《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可以在每个循环中无害地使用

和它有什么不同 …

javascript var let

2
推荐指数
1
解决办法
45
查看次数

为什么'let'引入的绑定范围有限?

在Lisp中(我仍在使用SBCL学习Lisp),声明了局部变量let,范围仅在该表达式中.这是为什么?与其他命令式语言(如C/C++/Java ...)不同,我们可以在其功能范围内的任何位置自由使用局部变量.

lisp variables scope let

1
推荐指数
1
解决办法
236
查看次数

使用LISP中的错误语法

尝试运行代码时,我不断收到此错误:

(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问题.

lisp recursion let

1
推荐指数
1
解决办法
1043
查看次数

'let'上的Haskell Parse错误

所以我是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)

haskell let rabin-karp

1
推荐指数
1
解决办法
1867
查看次数

为什么Java变量不经常被声明为`final`?比较swift中的let关键字

在swift中,let如果变量在初始化后没有改变,建议用关键字声明变量.我看到很多变量被声明为let.

在java中,我认为关键字final可以起到同样的作用.但是根据我有限的经验,我只看到人们final在极少数情况下声明变量,例如PI.

为什么Java变量不final经常被声明?有什么我想念的吗?

java variables final let swift

1
推荐指数
1
解决办法
237
查看次数

HASKELL ---在GHCI的"do"语法中使用"let"

我知道这有效:

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)

为什么不起作用?我可以让它运作吗?如果是,那怎么样?

syntax haskell let ghci

1
推荐指数
2
解决办法
150
查看次数

全局let变量存储在哪里?

我在全局范围内创建了一个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存储的确切位置?

javascript let ecmascript-6

1
推荐指数
1
解决办法
681
查看次数

只有其他的“如果让”块?

在一个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。)

刚刚发现了类似的问题

if-statement let swift

1
推荐指数
2
解决办法
2150
查看次数