1. 程式人生 > >JS中for迴圈變數作用域

JS中for迴圈變數作用域


js中作用域只有函式作用域和全域性作用域,在函式體內使用var 定義的變數,會被提到函式開始處進行定義,作用域為整個函式,常見的誤區如下

var a=[];
for(var i = 0;i<10;i++){
   var q = i;
   a[i]=function(){console.log(q)}
}
a[0]()
	
其中,由於for迴圈並不是一個函式體,所以for迴圈中定義的變數q和i是作用域for迴圈所在的函式體,和a同級,
i++ 和  q=i 並不是重新定義變數,只是重複賦值,最終迴圈結束,i = 10,q=9;  
由於function(){console.log(q)} 並不是立即執行,所以這裡的q一直是儲存的記憶體引用,最終所有的a[i]()都是輸出 9
不過,在es6中新增了let命令宣告變數,用法和var類似,不過let所宣告的變數,只在let命令所在的程式碼塊有效果,for迴圈的計數器中就很適合let命令
var a=[];
for(let i = 0;i<10;i++){
   ley q = i;
   a[i]=function(){console.log(q)}
}
a[6]()    //這裡會輸出   6  let宣告的變數僅在塊級作用域有效,所以這裡的i只在本輪迴圈有效果,每次迴圈的i其實都是一個新的變數

純屬個人觀點,有誤希望大家指點,謝謝

相關推薦

JSfor迴圈變數作用

js中作用域只有函式作用域和全域性作用域,在函式體內使用var 定義的變數,會被提到函式開始處進行定義,作用域為整個函式,常見的誤區如下 var a=[]; for(var i = 0;i<10;i++){ var q = i; a[i]=funct

JSfor迴圈如何令變數每次增量不是1?

for迴圈的常見格式是for(var i=0;i<arr.length;i++){……}。對於有些情況下,需要間隔獲取物件,採用加1的迴圈雖然可以通過設定條件來實現,但是直接從for迴圈的變數增量著手也可以一步到位。 for迴圈增量為2的程式碼: for(var i

JSfor迴圈之斐波拉切數列-兔子問題

兔子問題: 有個人想知道,一年之內一對兔子能繁殖多少對?於是就築了一道圍牆把一對兔子關在裡面。已知一對兔子每個月可以生一對小兔子,而一對兔子從出生後第3個月起每月生一對小兔子。假如一年內沒有發生死亡現象,那麼,一對兔子一年內(12個月)能繁殖成多少對?(兔子的規律為數列,1,1,2,3,5,8,

JS的塊級作用,var、let、const三者的區別

brush 語句 nbsp light 可見 undefine 函數 true 正常 1. 塊作用域{ } <script type="text/javascript"> { var a = 1; console.log

jsfor迴圈內的匿名函式使用i的問題及解決方案

問題描述 js中由於作用域鏈及js執行機制導致的for迴圈中匿名函式使用i的問題 <!--現有html結構程式碼如下--> <ul> <li>VueJs</li> <li>AngularJs<

JS實現停留幾秒sleep,Jsfor迴圈的阻塞機制,setTimeout延遲執行

//第一種,使用while迴圈 function sleep(delay) { var start = (new Date()).getTime(); while((new Date()).getTime() - start < delay) { continue;

js模仿塊級作用

js中沒有塊級作用域的概念,例如: function printNumber(num) { for(var i = 0; i < num; i ++ ) { console.log(i); }

jsfor迴圈獲取到的值都是最後一個解決方法

有5個按鈕:<div> <button>按鈕1</button> <button>按鈕2</button> <button>按鈕3</button&g

【SQL】小心在迴圈宣告變數——淺析SQL變數作用

本文適用:T-SQL(SQL Server) 先看這個語句: DECLARE @i INT = 0 WHILE @i < 3 --跑3圈 BEGIN --每圈都定義一個表變數,並插入一行 DECLARE @t TABLE(Col INT PRIMARY KEY) --主

深入理解JS變數作用

文章轉載http://blog.csdn.net/beijiguangyong/article/details/8301707點選開啟連結 在JS當中一個變數的作用域(scope)是程式中定義這個變數的區域。變數分為兩類:全域性(global)的和區域性的。其中全域性變數的

JS變數作用

作用域說明:指一個變數的作用範圍1.全域性作用域(1) 全域性作用域在頁面開啟時被建立,頁面關閉時被銷燬(2) 編寫在script標籤中的變數和函式,作用域為全域性,在頁面的任意位置都可以訪問到(3) 在全域性作用域中有全域性物件window,代表一個瀏覽器視窗,由瀏覽器建立

Jsarguments的使用、函式自呼叫、變數作用、函式作為引數傳入、函式作為返回值

1,arguments是一個比較特別的物件,每個函式中都有一個arguments,它接收函式傳入的引數,以陣列的形式存放在 arguments,可遍歷 //1,需求:求任意數的最大值 function getMax(){ var Max = arguments

JS獲取for迴圈i的實時值

最近在完成燈箱效果時,需要獲取for迴圈中i的實時值來定位大圖輪播的索引,但最初獲得的是i的最大值 幾種獲取for迴圈中i的實時值方法: 自調: for (var i = 0; i < itemli.length; i++) { (function (arg) {

Python變數作用,LEGB規則和閉包原理

問題來源   最近看到了一個python程式題,就三行程式碼,卻思考了很久才考慮明白,決定分享一下。 def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()]) 預計結果為:0, 2

關於C語言變數作用的個人心得

    這是本人的第一篇部落格,內容簡單總結淺陋。但這會是我寫部落格的開始,好啦!廢話不多說。。。。     學過C語言的同學可能都知道,在C中變數都具有作用域的說法。以下是標準的解釋和案例:    &

python包,模組,函式,與變數作用

python 專案的組織結構(最頂級的組織結構) 最頂級的是包,其次是模組,類,然後是函式、變數。 區分不同的模組前面加上包的名字:one.c1,two.c1(包.模組) 包下面可以有子包,也可以有模組 資料夾要變成一個包,要有一個__init__.py檔案(也是一個

go for-range迴圈變數

測試的時候發現一個有意思的地方,就是go始終利用同一個變數來接收集合中的一個值,只是在每次迴圈的時候重新賦值而已。   package main import (     "fmt"  

Js如何構造塊級作用,構造私有變數

眾所周知,Js是沒有塊級作用域的,但可以使用匿名函式來模仿塊級作用域。 1. for迴圈中定義的變數,從他有定義開始就可以在函式內隨處訪問他。 可以看出,for迴圈內定義的變數並沒有塊級作用域。注意:必須呼叫函式,函式內的變數才可以宣告。 2. 用匿名函式來模仿塊級作用域(私有作用

踩坑:javascriptfor迴圈變數不是Number型別導致for迴圈不執行

情景:從html獲取4對{起點元素(id記為start)和終點元素(id記為end)},遍歷起點到終點的所有元素,並打印出元素id(假設id連續)解決方案:Number(待轉換數)進行強制轉換js程式碼:控制檯:如上圖控制檯:第一對兒元素{43,46},進入for迴圈正常列印

js基礎--型別轉換與變數作用

型別轉換 轉換和相等性 由於JavaScript可以做靈活的型別轉換,因此其“==”相等運算子也隨相等的含義靈活多變。例如,如下這些比較結果均是true: null==undefined//這兩值被認為相等 "0"==0//在比較之前字串轉換成數字 0==false/