1.页面导入样式时,使用link和@import有什么区别?
- link属于html标签,@import是css提供的。
- 页面加载的同时,link同时也会加载;@import引用的css等到页面加载完再加载
2.js函数有哪几种声明方式?
表达式
和声明式
两种
- 函数声明式写法:
function test()
,这种写法会导致函数提升,所有通过function
声明的变量都会被解释器优先编译,不管声明在什么位置都可以调用它,但是她本身并不会被执行。 - 函数表达式写法:
var test = function(){}
,这种写法不会导致函数提升,必须先声明后调用。
test()//报错 TypeError:test is not a function
var test = function(){
console.log("测试")
}
区别
- 函数声明式变量会声明提前,函数表达式变量不会声明提前
- 函数声明中的
函数名
是必需的,而函数表达式中的函数名是可选的
- 函数表达式可以在定义的时候直接在表达式后面加()执行,而函数声明则不可以
function f00(){
console.log('测试声明式')
}()//unexpected token
var foo = function(){
console.log('测试表达式')
}();//测试
- 自执行函数即使带有函数名,它里面的函数还是属于函数表达式
(function foo(){
console.log('自执行函数')
})();//自执行函数
3.说说对“立即执行函数”的理解
JS立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行。
常见的两种写法
- 匿名函数包裹在一个括号运算符中,后面跟一个小括号
(function(){
//.....
})()
- 匿名函数后面跟一个小括号,包裹在一个括号运算符中
(function(){
//....
}())
注意:
- 函数体后面要有小括号
- 函数体必须是函数表达式而不能是函数声明
好处
- 不必为函数命名,避免污染全局变量
- 立即执行函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量
- 封装变量
4.call,bind,apply的区别
apply
apply
接受两个参数,第一个参数是this的指向
,第二个参数是函数接受的参数(数组形式传入)
改变this
指向后原函数立即执行,此方法只是临时改变this指向一次
function fn(...args){
console.log(this,...args);
}
let obj = {
myname:"张三"
}
fn.call(obj,[1,2]);//this会变成传入的obj,传入的参数必须是一个数组
fn(1,2);//this指向window
当第一个参数为null、undefined
时,默认指向window
(在浏览器中)
fn.apply(null,[1,2]);//this指向window
fn.apply(undefined,[1,2]);//this指向window
call
call
方法的第一个参数也是this
的指向,后面传入的是一个参数列表
跟apply
一样,改变this
指向后原函数会立即执行,且此方法只是临时改变this指向一次。
function fn(...args){
console.log(this,...args);
}
let obj = {
myname:"张三"
}
fn.call(obj,1,2);//this会变成传入的obj,传入的参数必须是一个数组
fn(1,2);//this指向window
当第一个参数为null、undefined
时,默认指向window(在浏览器中
)
fn.call(null,1,2)//this指向window
fn.call(undefined,1,2)//this指向window
bind
bind
和call
很相似,第一个参数也是this的指向,后面传入的也是一个参数列表(这个参数列表可分多次传入)
改变this
指向之后不会立即执行,而是返回一个永久改变this
指向的函数。
function fn(...args){
console.log(this,args);
}
let obj = {
myname:"张三"
}
const bindFn = fn.bind(obj);//this也会变成传入的obj,bind不是立即指向需要执行一次
bindFn(1,2);//this指向obj
fn(1,2);//this指向window
5.闭包是什么? 闭包的用途?
如果一个函数用到了它作用域外的函数,那么就称这个变量与这个函数之间的环境为闭包。
能够读取其它函数内部变量的函数,就是闭包。
用途
-
模仿块级作用域,隔离作用域,不会全局污。
-
封装私有变量。
-
储存变量。全局变量可以重复使用,但是容易造成变量污染,局部变量仅在局部作用域内有效,不可以重复使用,不会造成变量 污染
6.重排(回流)和重绘
- 重绘:某些元素的外观被改变,例如:元素的填充颜色.当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。
- 重排:重新生成布局,重新排列元素。重排也叫回流,简单的说就是重新生成布局,重新排列元素。
- 重绘不一定导致重排,但重排一定会导致重绘。
7.css的选择器有哪些?
id选择器,类选择器,标签选择器,属性选择器,后代选择器,子代选择器(>),兄弟选择器(~),伪类选择器,相邻选择器(+),伪元素选择器(::before ::after)