let命令

了解块级作用域 块级作用域是一个语句,将多个操作封装在一起,通常是放在一个大括号里,没有返回值。(但是对象声明用到的大括号不包括块级作用域,它包括的是对象) 块级作用域之中的每个函数都类似一个代码块。(但是这个代码块不包含它体内的另一个函数内的内容,类似于“我的附庸的附庸不是我的附庸”,函数1所包含的函数2的内容也不属于函数1的代码块)

阅读全文

百度前端技术学院 第四天学习总结

背景,边框,列表,链接相关属性

背景相关属性

background简写:

属性
background-color 特别注意:rgba中的a是透明度(0.0到1.0之间,0.5为半透明)
如:rgba(255,255,255,0)完全透明的白色
background-image url(xxx.jpg)
background-size 长度:
百分比:
cover:保留宽高比,使背景图像完全覆盖背景区域
contain:把图像图像扩展至最大尺寸,以使其宽度和高度完全适应内容区域。
background-repeat repeat-x:在水平方向上重复
repeat-y :在垂直方向上重复
no-repeat :不允许图像平铺
background-position 一对或单个关键字、百分数、长度值/混合使用(使用单个则默认另一个关键字是 center
关键字:top、bottom、left、right 和 center

边框相关属性

前三个属性可简写border属性:

属性
border-style 默认值:none,所以必须记得设置border-style,否则边框就不会出现
border-width 长度值/关键字
border-color 命名颜色/十六进制/ RGB 值
border-radius 一个或两个长度或百分比,第一个值定义水平半径,第二个值定义垂直半径

列表相关属性

可以在 <ul><ol><li>元素上简写list-style

属性
list-style-type项目符号的类型 默认disc(实心圆)
list-style-position列表标志位置 默认 outside
list-style-image图像标志 url(xxx.jpg)
默认none

链接相关属性

选择器四种状态:**(他们不是属性!)**

  • a:link - 普通的、未被访问的链接
  • a:visited - 用户已访问的链接
  • a:hover - 鼠标指针位于链接的上方
  • a:active - 链接被点击的时刻

注意:

  • a:hover 必须位于 a:link 和 a:visited 之后
  • a:active 必须位于 a:hover 之后

举例:

1
a:link {color:#FF0000;}	

属性

属性
文本修饰(下划线)text-decoration(多个属性值) 具体参考
背景色background-color 常用俱可
鼠标光标的样式cursor 属性值
文字的轮廓(框)outline 简写:宽度 (outline-width)、样式(outline-style) 、颜色
outline-width 关键字(取决于用户代理):thin/medium/thick
长度:10px/1rem
全局值:inherit
outline-style 关键字:none(默认值);auto; dotted;dashed; solid; double;groove; ridge;inset; outset;
全局值:inherit;initial; unset;

CSS 各种选择器的概念,使用方法及使用场景。

简单选择器

  • ID选择器:#ID名称{属性:值;}
  • 类选择器:.类名称{属性:值;}
  • 标签(元素)选择器:html元素名{属性:值;}
  • 通用选择器:*{属性:值;}

属性选择器

  • 属性选择器:[属性名]{CSS样式}
  • 属性和值选择器:[属性名=值]{CSS样式}
  • 属性和(多个)值选择器(类似模糊查找):
语法 含义
[属性名~=值]{CSS样式} 适用于HTML中由空格分隔的属性值
`[属性名 =值]{CSS样式}`
[属性名^=值]{CSS样式} 匹配属性值以指定值开头的每个元素
[属性名$=值]{CSS样式} 匹配属性值以指定值结尾的每个元素
[属性名*=值]{CSS样式} 匹配属性值中包含指定值的每个元素

伪类选择器

  • :first-child表示一组同级元素中的第一元素
  • :last-child表示一组同级元素中的最后一个元素
  • :only-child表示没有任何兄弟姐妹的元素
  • :invalid设置值无效时的样式

伪元素选择器

  • 注意:使用双冒号,与伪类选择器区分开。
  • ::first-line伪元素设置文本首行的特殊样式
  • ::first-letter 伪元素设置文本首字母的特殊样式
  • ::before伪元素在元素前面插入新内容

派生选择器

  • 用于选择一个标签中的所有另一个标签。(id选择器与类选择器、属性选择器也可以派生)
  • 空格分隔开两个元素名称。

后代选择器

  • 空格分隔两个选择器名称
  • 选择的元素是其选择器的后代。他们不需要是直接子元素就可以配对(子孙后代都可以)。

儿童组合器

  • 大于号分隔
  • 仅当选择器选择直接子元素时才匹配。层次结构后面的子孙不匹配。(注意:直接子元素并不是一定只有一个,要与伪类选择器:first-child区别开来)

直接相邻的同级选择器

  • 加号分隔
  • 用于选择与层次结构中相同级别的另一个元素相邻的对象
  • 注意:这两个选择器不仅要是同级别的,还要直接相邻。

一般同级[所有的同级选择器]

  • 用**~分隔**开两个选择器。
  • 用于选择与层次结构中相同级别的所有指定选择器的对象(包括直接相邻的同级),也可以使用常规的同级组合器。
  • 注意:空格分隔开的是父元素与子元素组成的后代选择器,~分隔开的是同级别的所有指定选择器的对象。

CSS 选择器的优先级

  • 影响优先级的因素从高到低的顺序是:重要性、特异性、源顺序
  • 注意:并不是整个规则都会被覆盖,只是相同的属性。

源顺序(靠后的获胜)

如果有多个选择器作用于同一个元素,则靠后的将获胜

特异性(计算各个选择器的特异性值)

  • 选择器具有的特异性程度是使用四个不同的值(或成分)来衡量的,可以将其视为千位,百位,十位和个位这四列中的四个个位数:
范围
如果声明位于style属性内(也称为内联样式)内,则在此列中得一千分。这样的声明没有选择器,因此它们的特异性始终只是1000
在此列中为整体选择器中包含的每个ID选择器打分(有几个ID选择器就几百分
在此列中为整体选择器中包含的每个类选择器,属性选择器或伪类计分(注意属性选择器的书写方法)
在此列中为整体选择器中包含的每个元素选择器或伪元素*打一分。

计算举例

重要性!important

  • 超越了上述两个级联的常规规则,但最好不要用。
  • 语法选择器{属性: 属性值 !important;}

call()与apply()

方法重用:call() 和 apply()

  • 不带参数的使用方法非常相似。
  • 带参数的使用方法有所区别:
方法 参数 举例
call() 参数列表 person.fullName.call(person1, “Oslo”, “Norway”);
apply() 数组形式 person.fullName.apply(person1, [“Oslo”, “Norway”]);
  • 如果要使用数组而不是参数列表,则 apply() 方法非常方便。

面试题

语句var arr=[a,b,c,d];执行后,数组arr中每项都是一个整数,能得到其中最大整数语句有:

  1. Math.max(arr[0], arr[1], arr[2], arr[3])
  2. Math.max.call(Math, arr[0], arr[1], arr[2], arr[3])
  3. Math.max.apply(Math,arr)

不能得到其中最大整数语句有:

1
Math.max(arr)

解析

Math的max()不支持传入数组,所以错误。


JavaScript 函数 Call

可以通过 call()调用属于另一个对象的方法

例子1:普通方法调用

  • 下面的例子创建了带有三个属性的对象(firstName、lastName、fullName)。
    1
    2
    3
    4
    5
    6
    7
    8
    var person = {
    firstName:"Bill",
    lastName: "Gates",
    fullName: function () {
    return this.firstName + " " + this.lastName;
    }
    }
    person.fullName(); // 将返回 "Bill Gates"
  • fullName 属性是一个方法。person 对象是该方法的拥有者。
  • fullName 属性属于 person 对象的方法。

例子2:使用函数 Call

分别让person1与person2去调用person的fullName 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var person = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
var person1 = {
firstName:"Bill",
lastName: "Gates",
}
var person2 = {
firstName:"Steve",
lastName: "Jobs",
}
person.fullName.call(person1); // 将返回 "Bill Gates"
person.fullName.call(person2); // 将返回 "Steve Jobs"

完整例子

例子3:带参数的 call() 方法

让person1带着参数”Seattle”, “USA”去调用person的fullName属性(方法)

1
2
3
4
5
6
7
8
9
10
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"Bill",
lastName: "Gates"
}
person.fullName.call(person1, "Seattle", "USA");

完整例子


JavaScript 函数 Apply

  • apply()会改变this的指向,
  • 可以通过 apply() 方法调用属于另一个对象的方法。
  • 但不仅限于此,当设置第一个参数为null时可以在某些本来需要写成遍历数组变量的任务中使用内建的函数,也就是说此时apply()的作用不是调用属于另一个对象的方法,而是使参数数组中的每一个元素都去执行func函数。【如:下方例子“使用Apply()在数组上模拟 max 方法”】
  • call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组
  • apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
  • 语法func.apply(thisArg, [argsArray])
参数 描述
thisArg 可选的。
在 func 函数运行时使用的 this 值。
请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时this会自动替换为指向全局对象,原始值会被包装。
argsArray 可选的。
一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。
如果该参数的值为 null 或 undefined,则表示不需要传入任何参数。
从ECMAScript 5 开始可以使用类数组对象。
  • 返回值:调用有指定this值和参数的函数的结果。
  • 描述:在调用一个存在的函数时,你可以为其指定一个 this 对象。 this 指当前对象,也就是正在调用这个函数的对象。 使用 apply, 你可以只写一次这个方法然后在另一个对象中继承它,而不用在新对象中重复写该方法。
    你也可以使用 arguments对象作为 argsArray 参数。 arguments 是一个函数的局部变量。 它可以被用作被调用对象的所有未指定的参数。 这样,你在使用apply函数的时候就不需要知道被调用对象的所有参数。 你可以使用arguments来把所有的参数传递给被调用对象。 被调用对象接下来就负责处理这些参数。

例子:使用函数Apply

让person1去调用person的fullName 方法

1
2
3
4
5
6
7
8
9
10
var person = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
var person1 = {
firstName: "Bill",
lastName: "Gates",
}
person.fullName.apply(person1); // 将返回 "Bill Gates"

例子:带参数的 apply() 方法

apply() 方法接受数组中的参数:

1
2
3
4
5
6
7
8
9
10
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"John",
lastName: "Doe"
}
person.fullName.apply(person1, ["Oslo", "Norway"]);

完整例子


使用Apply()在数组上模拟 max 方法

Math的max()方法

首先我们了解可以使用 Math.max() 方法找到(数字列表中的)最大数字:

1
Math.max(1,2,3);  // 会返回 3

完整例子

让数组调用Math的max()方法

但是JavaScript 数组没有 max() 方法,因此我们可以通过apply()让数组调用 Math的max() 方法

1
Math.max.apply(null, [1,2,3]); // 也会返回 3

完整例子

第一个参数(null)无关紧要。在本例中未使用它。这些例子会给出相同的结果

  1. Math.max.apply(Math, [1,2,3]); // 也会返回 3
  2. Math.max.apply(" ", [1,2,3]); // 也会返回 3
  3. Math.max.apply(0, [1,2,3]); // 也会返回 3

JavaScript 严格模式

在 JavaScript 严格模式下,如果 apply() 方法的第一个参数不是对象,则它将成为被调用函数的所有者(对象)。在“非严格”模式下,它成为全局对象。


不能改变箭头函数this指向

  • 注意: call, apply, bind 都不能改变箭头函数中的 this 指向
  • 因为箭头函数的this只和定义时的作用域this有关,和调用者/调用环境无关,也永远不会改变