一.作用域:瀏覽器給js的一個生存環境 (棧內存)。
二.作用域鏈:js中的關鍵字var和fuanction都可以提前聲明和定義,提前聲明和定義的放在我們的內存地址 (堆內存)中。
然后js從上到下逐行執行,遇到變量就去內存地址查找是否存在這個變量,如果有就使用,沒有就繼續向父級作用域
查找直到window下結束,這種查找機制叫做作用域鏈。
三.Js代碼中存在大量的變量和函數,我們在使用它們的時候一定要知道它們到底歸屬誰。
四.This
1.this是js的一個關鍵字,指定一個對象然后去替代它。
函數內的this和函數外的this,函數內的this指向行為發生的主體。函數外的this都指向window沒有意義。
為什么還是window?
因為瀏覽器執行js代碼的時候在執行chifan()這個函數的時候查找到變量chifan的歸屬是window,在window下的
變量可以寫成window.chifan函數可以寫成window.chifan()
2.函數內的this和函數在什么環境中定義沒有關系,而只和自己的主體有關。
3.主體怎么找?
就看函數 (方法)帶不帶“.”,如果函數和方法執行時帶“.”,那么this就指向“.”前面的對象,如果不帶“.”,就
指向window
4.自執行函數里面的this都指向window。
This和變量面試題,先找this的主體是誰,然后把它換成那個主體就行啦
5.給元素中的某一事件綁定方法,當事件觸發時,執行綁定的方法,方法中的this指向當前元素。
重點是函數套函數的時候,不管它怎么定義,關鍵是看它執行時候的主體。
360經典面試
js的數據類型
基本數據類型: String Undefined Null Boolean Number
引用數據類型: Object Array Function
二者的區別:
基本數據類型就是簡單的操作值,引用數據類型,把引用地址賦值給變量
堆內存
就是存放代碼塊的,存放形式有兩種,一種是對象以鍵值對的形式存放
另一種就是函數 以字符串的形式存放。
案例:
引用數據類型的賦值,是把引用地址賦給它,在修改屬性的時候,通過地址查找然后改掉。
應用數據類型,如何操作?
先通過引用地址去查找堆內存中的代碼,然后再去修改
This研究在函數內部
在js中的函數形式的種類
1. 普通函數 function fn(){} var fn = function ()
2. 類
對象 Object
對象里面的數據以鍵值對的形式存在。跟json一樣。
1. 單例模式
我們把變量zhang的li叫“命名空間”
作用域和堆內存的區別
作用域是函數執行的時候產生 fn()
函數執行的時候首先會開辟一個新的內存空間叫棧內存 (環境或作用域)
數據類型在賦值的時候會開辟一個新的內存空間叫堆內存 (存放代碼塊的)
二者都會形成一個內存地址
生成對象的單例模式
優勢,每個對象都是獨立的,即便屬性起的名字一樣,不會相互干擾,方便現在流行的
開發模式“模塊化開發”。如果需要使用里面的屬性,用運算符 如 zhang.name 或 zhang
["name"],判斷一個屬性是不是這個對象的用in運算符 如 “name”in zhang 如果遍歷這個
對象用for(attr in zhang){}
缺點,不可以批量生產,只能一個一個去創建。