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的原理啥的。
除了问问题之外,剩下的就是眼缘了,如果双方对上眼了,至少技术那块能谈拢,剩下的薪资就不属于我的所能把控了。