A. 理解什麼是JS作用域,閉包和基本的JS作用域面試題
作用域:它是指對某一變數和方法具有訪問許可權的代碼空間, 在JS中, 作用域是在函數中維護的。表內示變數或容函數起作用的區域,指代了它們在什麼樣的上下文中執行,亦即上下文執行環境。Javascript的作用域只有兩種:全局作用域和本地作用域,本地作用域是按照函數來區分的。
閉包:在js中的我的理解就是函數嵌套函數,當內部函數在定義它的作用域的外部被引用時,就創建了該內部函數的閉包 ,如果內部函數引用了位於外部函數的變數,當外部函數調用完畢後,這些變數在內存不會被 釋放,因為閉包需要它們.
使用閉包要注意:
1)由於閉包會使得函數中的變數都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變數全部刪除。
2)閉包會在父函數外部,改變父函數內部變數的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變數當作它的私有屬性(private value),這時一定要小心,不要隨便
改變父函數內部變數的值。
B. jsp的開包閉包是什麼
閉包是函數和引用環境組成的整體,可以包含自由(未綁定)變數的代碼塊
開包就是函數與變數分開來看。。。
C. web前端面試經常問到的面試題有哪些
Web前端經常被問到的面試題及答案
一、HTML+CSS
1.對WEB標准以及W3C的理解與認識
標簽閉合、標簽小寫、不亂嵌套、提高搜索機器人搜索幾率、使用外
鏈css和js腳本、結構行為表現的分離、文件下載與頁面速度更快、內容能被更多的用戶所訪問、內容能被更廣泛的設備所訪問、更少的代碼和組件,容易維
護、改版方便,不需要變動頁面內容、提供列印版本而不需要復制內容、提高網站易用性;
2.xhtml和html有什麼區別
HTML是一種基本的WEB網頁設計語言,XHTML是一個基於XML的置標語言
最主要的不同:
XHTML 元素必須被正確地嵌套。
XHTML 元素必須被關閉。
標簽名必須用小寫字母。
XHTML 文檔必須擁有根元素。
3.Doctype? 嚴格模式與混雜模式-如何觸發這兩種模式,區分它們有何意義?
用於聲明文檔使用那種規范(html/Xhtml)一般為 嚴格 過度 基於框架的html文檔
加入XMl聲明可觸發,解析方式更改為IE5.5 擁有IE5.5的bug
4.行內元素有哪些?塊級元素有哪些?CSS的盒模型?
塊級元素:div p h1 h2 h3 h4 form ul
行內元素: a b br i span input select
Css盒模型:內容,border ,margin,padding
5.CSS引入的方式有哪些? link和@import的區別是?
內聯 內嵌 外鏈 導入
區別 :同時載入
前者無兼容性,後者CSS2.1以下瀏覽器不支持
Link 支持使用javascript改變樣式,後者不可
6.CSS選擇符有哪些?哪些屬性可以繼承?優先順序演算法如何計算?內聯和important哪個優先順序高?
標簽選擇符 類選擇符 id選擇符
繼承不如指定 Id>class>標簽選擇
後者優先順序高
7.前端頁面有哪三層構成,分別是什麼?作用是什麼?
結構層 Html 表示層 CSS 行為層 js
8.css的基本語句構成是?
選擇器{屬性1:值1;屬性2:值2;……}
9.你做的頁面在哪些流覽器測試過?這些瀏覽器的內核分別是什麼?
Ie(Ie內核) 火狐(Gecko) 谷歌(webkit) opear(Presto)
二、Javascript
1.javascript的typeof返回哪些數據類型
Object number function boolean underfind
2.例舉3種強制類型轉換和2種隱式類型轉換?
強制(parseInt,parseFloat,number)
隱式(== – ===)
3.split() join() 的區別
前者是切割成數組的形式,後者是將數組轉換成字元串
4.數組方法pop() push() unshift() shift()
Push()尾部添加 pop()尾部刪除
Unshift()頭部添加 shift()頭部刪除
5.事件綁定和普通事件有什麼區別
6.IE和DOM事件流的區別
1.執行順序不一樣、
2.參數不一樣
3.事件加不加on
4.this指向問題
7.IE和標准下有哪些兼容性的寫法
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
8.ajax請求的時候get 和post方式的區別
一個在url後面 一個放在虛擬載體裡面
有大小限制
安全問題
應用不同 一個是論壇等只需要請求的,一個是類似修改密碼的
9.call和apply的區別
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
10.ajax請求時,如何解釋json數據
使用eval parse 鑒於安全性考慮 使用parse更靠譜
11.b繼承a的方法
12.寫一個獲取非行間樣式的函數
function getStyle(obj,attr,value)
{
if(!value)
{
if(obj.currentStyle)
{
return obj.currentStyle(attr)
}
else
{
obj.getComputedStyle(attr,false)
}
}
else
{
obj.style[attr]=value
}
}
D. python函數的閉包怎麼理解
1. 閉包的概念
首先還得從基本概念說起,什麼是閉包呢?來看下維基上的解釋:
復制代碼代碼如下:
在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變數的函數。這個被引用的自由變數將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。閉包在運行時可以有多個實例,不同的引用環境和相同的函數組合可以產生不同的實例。
....
上面提到了兩個關鍵的地方: 自由變數 和 函數, 這兩個關鍵稍後再說。還是得在贅述下「閉包」的意思,望文知意,可以形象的把它理解為一個封閉的包裹,這個包裹就是一個函數,當然還有函數內部對應的邏輯,包裹裡面的東西就是自由變數,自由變數可以在隨著包裹到處游盪。當然還得有個前提,這個包裹是被創建出來的。
在通過Python的語言介紹一下,一個閉包就是你調用了一個函數A,這個函數A返回了一個函數B給你。這個返回的函數B就叫做閉包。你在調用函數A的時候傳遞的參數就是自由變數。
舉個例子:
復制代碼代碼如下:
def func(name):
def inner_func(age):
print 'name:', name, 'age:', age
return inner_func
bb = func('the5fire')
bb(26) # >>> name: the5fire age: 26
這裡面調用func的時候就產生了一個閉包——inner_func,並且該閉包持有自由變數——name,因此這也意味著,當函數func的生命周期結束之後,name這個變數依然存在,因為它被閉包引用了,所以不會被回收。
另外再說一點,閉包並不是Python中特有的概念,所有把函數做為一等公民的語言均有閉包的概念。不過像Java這樣以class為一等公民的語言中也可以使用閉包,只是它得用類或介面來實現。
更多概念上的東西可以參考最後的參考鏈接。
2. 為什麼使用閉包
基於上面的介紹,不知道讀者有沒有感覺這個東西和類有點相似,相似點在於他們都提供了對數據的封裝。不同的是閉包本身就是個方法。和類一樣,我們在編程時經常會把通用的東西抽象成類,(當然,還有對現實世界——業務的建模),以復用通用的功能。閉包也是一樣,當我們需要函數粒度的抽象時,閉包就是一個很好的選擇。
在這點上閉包可以被理解為一個只讀的對象,你可以給他傳遞一個屬性,但它只能提供給你一個執行的介面。因此在程序中我們經常需要這樣的一個函數對象——閉包,來幫我們完成一個通用的功能,比如後面會提到的——裝飾器。
3. 使用閉包
第一種場景 ,在python中很重要也很常見的一個使用場景就是裝飾器,Python為裝飾器提供了一個很友好的「語法糖」——@,讓我們可以很方便的使用裝飾器,裝飾的原理不做過多闡述,簡言之你在一個函數func上加上@decorator_func, 就相當於decorator_func(func):
復制代碼代碼如下:
def decorator_func(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@decorator_func
def func(name):
print 'my name is', name
# 等價於
decorator_func(func)
在裝飾器的這個例子中,閉包(wrapper)持有了外部的func這個參數,並且能夠接受外部傳過來的參數,接受過來的參數在原封不動的傳給func,並返回執行結果。
這是個簡單的例子,稍微復雜點可以有多個閉包,比如經常使用的那個LRUCache的裝飾器,裝飾器上可以接受參數@lru_cache(expire=500)這樣。實現起來就是兩個閉包的嵌套:
復制代碼代碼如下:
def lru_cache(expire=5):
# 默認5s超時
def func_wrapper(func):
def inner(*args, **kwargs):
# cache 處理 bala bala bala
return func(*args, **kwargs)
return inner
return func_wrapper
@lru_cache(expire=10*60)
def get(request, pk)
# 省略具體代碼
return response()
不太懂閉包的同學一定得能夠理解上述代碼,這是我們之前面試經常會問到的面試題。
第二個場景 ,就是基於閉包的一個特性——「惰性求值」。這個應用比較常見的是在資料庫訪問的時候,比如說:
復制代碼代碼如下:
# 偽代碼示意
class QuerySet(object):
def __init__(self, sql):
self.sql = sql
self.db = Mysql.connect().corsor() # 偽代碼
def __call__(self):
return db.execute(self.sql)
def query(sql):
return QuerySet(sql)
result = query("select name from user_app")
if time > now:
print result # 這時才執行資料庫訪問
上面這個不太恰當的例子展示了通過閉包完成惰性求值的功能,但是上面query返回的結果並不是函數,而是具有函數功能的類。有興趣的可以去看看Django的queryset的實現,原理類似。
第三種場景 , 需要對某個函數的參數提前賦值的情況,當然在Python中已經有了很好的解決訪問 functools.parial,但是用閉包也能實現。
復制代碼代碼如下:
def partial(**outer_kwargs):
def wrapper(func):
def inner(*args, **kwargs):
for k, v in outer_kwargs.items():
kwargs[k] = v
return func(*args, **kwargs)
return inner
return wrapper
@partial(age=15)
def say(name=None, age=None):
print name, age
say(name="the5fire")
# 當然用functools比這個簡單多了
# 只需要: functools.partial(say, age=15)(name='the5fire')
看起來這又是一個牽強的例子,不過也算是實踐了閉包的應用。
E. web前端面試怎麼介紹
你的筆試題, 根據其做延伸.
你的簡歷, 技術棧、工作外學習情況、項目經驗. 第一頁很重要, 最好都能掌握, 有亮點更好.
面試官額外的延展的知識點, 隨機問,看你運氣和積累(一般會提及到 ES6、解決實際問題的方法、數據結構與演算法都有可能).
應對
刷題, 各種基礎題會幫你快速回憶起來, 比你看書快, 如果基礎不好的話, 看書好好學學吧.
簡歷上自己寫的東西, 要能說出來.
積累, 每次面試不成功就回來填坑吧, 還是有掌握不到位的. 我覺得能堅持下來的話, 找工作只是時間問題.
據公司業務不同, 著重點不一樣, 公司能把你簡歷挑出來, 就說明有用人單位感興趣的部分.
可能你寫的是熟練使用 Vue, 公司也是這個技術棧.
可能你知識寫的全面, 公司想面面你實際掌握怎麼樣.
可能你項目寫的貼合用人單位需要, 比如都是做後台管理的.
框架問題: (Vue 舉例, 3框架實質問題差不多, 具體有些差異)
封裝過哪些組件?有自己寫過 UI 組件嗎?
什麼是 MVVM , 和 MVC 是什麼區別, 原理是什麼?
父子組件怎麼通信的?
兄弟組件怎麼通信的?
生命周期有哪些, 怎麼用?
Vue 全家桶都用過哪些?具體怎麼用?
HTML5 + CSS3
盒子模型
如何給未知寬高的圖片垂直居中對齊? 有幾種方法?
移動端的 rem 布局.
前端可以做哪些優化, 或問你 SEO, 基本都問.
清除浮動方式和原理, 基本都問. 幾種方式? 原理? 為什麼要用偽元素? 具體代碼怎麼寫,為什麼這么寫?
清除浮動就會涉及到 BFC 的問題.
給你實際頁面例子, 讓你口述布局或手寫實現細節, 可以使用幾種方法, 怎麼寫兼容性好, 拓展性好.
具體 API 哪個 CSS 版本的?
CSS3 新增了哪些 API?
可能問你哪些 API 是 CSS 哪個版本的? 兼容性怎麼樣.
CSS hack 是什麼? 包含什麼? 怎麼處理兼容性問題?
HTML5 新增了哪些 API? 哪些比較常用? 用來做什麼? 實際怎麼用?
cookie, session, localStrorage, sessionStorage 區別, 具體怎麼用代碼去操作?
JavaScript
變數聲明提升的問題.
閉包的原理, 閉包的各種題, 基本都問.
DOM2 事件流, 冒泡和捕獲問題?
this 指向問題, 一般都是在筆試題里, 拿著問你, 問的比較多.
call 和 apply 區別? 有的還會加問 bind?
面向對象編程中的繼承問題, 原型鏈問題在筆試題里比較常見.
jQuery API , 各種操作 DOM 用法, 還有一些新的 API, 這種在不用 3 大框架的公司會問的很詳細.
可能有些考演算法結構的, 可以了解一下, 一般前端掌握的很少.
Ajax 基本都問, 問的細節可能不同, 比如 get 和 post 有什麼區別?
數組的方法 - es6 以下基本都能熟練使用, 應該會加分不少
字元串的方法 - 拼接, 截取, 帶些正則
數組去重問的挺多的(解法很多, ES6 有很多簡短寫法)
ES6 的 Promise , 很多都會問. 如果公司用框架或者你寫了, 還會問你 Class.
var, let, const區別, 問的多.
棧和隊列結構, 有的會問.
跨域問題: 同源策略, 解決方案, 解決原理(比如 jsonp 的原理), 這里都是高發區.
F. 為什麼面試都會問下很基礎的知識,而實際工作中這些基礎根本用不到
中國的軟體開發行業,存在一個搞笑的現象,招聘者為了抬高自己的面子,把面試題出得天花亂墜,而實際上他們做的項目卻是無比弱智.
仔細分析那些題目,你會發現漏洞百出,破綻百出.以java開發面試,舉例如下:
1.關於框架
招聘者:你平時常用哪些框架?
應聘者:在沒有甲方和項目經理刻意要求的情況下,基本上不用框架,自己寫原生.
招聘者:但是框架可以解決很多問題,比如,spring的面向切面的思想有助於使代碼具有更好的可讀性和易維護性.
應聘者:如果框架確實能夠有效地解決我的問題,我會願意去學習並且使用它們的.可是,在我之前的開發經歷中,還沒有遇到過特別棘手的問題.
招聘者:...
2.關於高並發
招聘者:高並發算不算棘手的問題?你怎麼應對高並發?
應聘者:線程池加同步隊列加拒絕策略,以保護伺服器不會癱瘓.
招聘者:你為什麼不使用redis來處理高並發?
應聘者:既然java自己已經有能力來解決這個問題了,就沒有必要再去求助於別的東西了.
招聘者:...
3.關於資料庫
招聘者:你做過mysql優化嗎?
應聘者:我不需要做mysql優化.因為mysql+php的時代已經過去了,現在應該屬於oracle+java的時代.除非貴公司還做外包項目而不是自主產品.
招聘者:但是這並不意味著java就不能與mysql相配合.
應聘者:我看到甲骨文官方已經明文規定了,java的最佳搭檔是oracle,而不是mysql.這是官方的明文規定.
招聘者:...
4.關於即時通信
招聘者:你了解環信或者融雲等即時通信嗎?
應聘者:聽說過環信,沒有接觸過它.沒有聽說過融雲.
招聘者:那麼當你需要主動推送消息的時候,怎麼辦?
應聘者:開socket長連接,一切實時通信全是基於tcp/ip協議或者ws協議的長連接機制.
招聘者:...
5.關於前端
招聘者:你熟悉前端的js嗎?
應聘者:熟悉,js是一種基於對象的語言.
招聘者:為什麼是基於對象而不是面向對象?
應聘者:java是面向對象的,其三大特性為:封裝,繼承,多態.而js是基於對象的,其兩大特性為:原型,閉包.這兩者完全不是一回事.
招聘者:...
筆者的結論:表面上面試官提出許多足以建造宇宙飛船的問題,現實卻是你到了公司里頂多在生產某個不起眼兒的螺絲.當你再去反思那些既可笑又可悲的面試題時,你便會明白那些題目本身是漏洞百出,甚至所謂的架構師的水平根本不如你.他能面試你,而你不能面試他,原因不在於他掌握了技術,而在於他掌握了權力.
每一道題皆反映了該公司當前的狀態和困境.他過於強調依賴框架,中間件和第三方服務商,是因為他對於java底層的反射委託調度原理不精通.他使用mysql而不是oracle,是因為此公司的資金不充足,無法為自己的軟體產品挑選真正優秀且強壯的資料庫.他把面向對象和基於對象兩個概念混淆了,是因為他從來沒有悟透本質的程序語言和腳本語言的核心內涵.
綜上所述,求職者千萬不能被企業給糊弄了.歸根結底一句話:只要你自己充滿了信心,走南闖北都不怕.
G. web前端 面試必問的幾個問題有那些
根據面試官的不同,面試的內容頁不一樣的。一般的話就是html+css布局佔一部分,例如各瀏回覽器的兼容性,答然後就是js的ajax,閉包,冒泡什麼的,js會占很大一部分,也有一部分面試官會拋開這些,直接問公司需要的內容,這樣的話就是考驗你的實際操作了,這類的面試官我很喜歡,就是直接問布局,數據填充之類的,能學到很多東西,建議面試時偷偷用手機錄音,回來之後聽一聽,研究一下自己不會的問題,因為面試完之後,你可能就會忘了面試時都問過什麼了
H. js 閉包邏輯面試題
主要問題在於,自執行函數沒有形參i,如果加一個形參i,輸出的就是0-4了。如回這樣
for(vari=0;i<5;i++){
(function(i){
答setTimeout(function(){
console.log(i)
},i*1000)
})(i)
}
這就是作用域的問題,for循環每執行一遍,都會生成一個非同步函數setTimeout,由於這個時候是同步的,自執行函數里邊的i,讀取的就是每次for循環的i,所以每次執行相差1秒。然後js是單線程的,setTimeout需要等for執行完之後執行。這時候,for循環執行完使得i的值變為5,而自執行函數沒有形參,setTimeout回調函數讀的變數是自執行函數外的變數i,所以輸出為5。也就是每隔一秒輸出一個5。
你可以試著把5變成更大的數,也是一樣的,輸出的就是這個數。
I. 前端面試:js閉包,為什麼要使用閉包
要理解閉包,首先理解javascript特殊的變數作用域,變數的作用於無非就是兩種:全局變數,專局部變數。
javascript語言的屬特殊處就是函數內部可以讀取全局變數。
1.如何從外部讀取局部變數?
我們有時候需要得到函數內的局部變數,但是在正常情況下,這是不能讀取到的,只有通過變通方法才能讀取到。
2.閉包的概念
各種專業文獻上的「閉包closure」定義非常抽象,很難看懂。可以這樣理解,閉包就是i能夠讀取其他函數內部變數的函數。
在javascript語言中,只有函數內部的子函數才能讀取局部變數,因此可以把閉包簡單理解成「定義在一個函數內部的函數」。所以本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
3.閉包的用途
閉包可以讀取函數內部的變數,可以讓變數的值始終保持在內存中。
J. 面試web前端的工作,會被問到什麼問題
如果是個初級前端,那麼就問些基礎性的問題,例如CSS中的選擇器、 HTML和XHTML的區別、內JavaScript中的類型轉換等,都是些簡單的容問題,平時稍微注意一下就能輕松答出,我很少問一些抽象的概念,例如閉包,知道怎麼用就行了,不會強求面試者對這個概念進行總結。
還有就是會問些當前公司所用到的技術棧里的問題,例如有沒有用過自動化構建、React或VUE有沒有實際使用過,都是一些操作性的問題,不會問太深的,例如React的原理啥的。
除了問問題之外,剩下的就是眼緣了,如果雙方對上眼了,至少技術那塊能談攏,剩下的薪資就不屬於我的所能把控了。