前端知识复习一

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

bindcall很相似,第一个参数也是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)

猜你喜欢

转载自blog.csdn.net/m0_64562972/article/details/130795999