JS中的參數傳遞還是引用傳遞,深拷貝

一不小心又造了個坑,前段時間,發現博客鏈接沒法通過href轉到https的網站了。點了點發現,在新標籤頁中打開還是可以的,所以改了兩行代碼。


今天點了下才發現,第42行的改動,給div添加event事件中,window.open打開的_link,居然都是一樣的。用chrome debug了下試試,發現每次斷點到41行就直接跳過去了。雖然link在循環中在不停的變,單最終所有的link都用了同一個值,就是blogsJsonArray中最後的一個數據中的值。What happens?

簡單瞭解了下,js中參數有兩大類:1、傳值類型:undefined,string,null,boolean,number。2、引用類型:object。(https://www.cnblogs.com/chenwenhao/p/7009606.html)。

回過頭來,看看,在代碼塊內,_link是個局部變量,在循環過程中會改變他的值,每次循環都會改變這個局部變量的值。另外,addListener的時候只是定義了一個函數,並沒有在循環的時候就賦值。

通過什麼解決這個問題?閉包?閉包全局可以訪問局部變量。貌似用不上,這個地方是局部函數,訪問“父函數“的值,而且希望每個循環中訪問到的是不一樣的。

通過深拷貝來解決這個問題?就是在別的地方保存這個循環中的值,貌似可行。如果在循環中深拷貝_link到一個局部對象中,當循環結束,那麼每次循環這個局部變量的值也會變得和_link一樣,不可行。如果在click綁定的函數中增加一個變量,進行深拷貝,也不可行,因爲這個函數並沒有執行,深拷貝發生在循環之後。

突然發現,每次在循環中生成的ahref,是一個新的內存空間。ok,就這麼幹了:

window.open($(this).find("a")[0].href);

試了試,果然可以。這相當於把這個_link拷貝到了div的一個屬性中去。而div又可以在click的時候獲取到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章