算了,这次勤快点,还是码码字。上次照片拍得实在太丑。
首先非常非常感谢 pink老师,感谢他的无私贡献,或许能带领我走进前端的殿堂。
一.arguments的使用
当我们不确定有多少个参数传递的时候,可以用argument来获取。在JavaScript中,arguments实际上是当前函数的一个内置对象。所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
arguments展现形式是一个伪数组,因此可以进行遍历,伪数组具有以下特点:
e.g 求任意个数的最大值
function getMax(){
var max = arguments[0];
for (var i = 1;i < arguments.length;i++){
if (max < arguments[i])
max = arguments[i];
}
return max;
}
console.log(getMax(1,2,5,9,40,29,30));
二.函数练习
practice1 利用函数翻转任意数组reverse
function reverse(arr){
var newArr = [];
for (var i = arr.length - 1; i>=0; i--){
newArr[newArr.length] = arr[i];
}
return newArr;
}
var arr1 = reverse([1,3,5,7,9]);
console.log(arr1);
practice2 利用函数冒泡排序
function sort(arr){
for (var i = 0; i < arr.length-1; i++){
for (var j = 0; j< arr.length - i - 1;j++){
if (arr[j] > arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
var arr1 = sort([1,8,2,5,7]);
console.log(arr1)
practice3 利用函数判断是否是闰年
function isRunYear(year){
return !((year%400)||(year%4==0&&year%100!=0))
}
console.log(isRunYear(2020))
三.函数的两种声明方式
1.利用函数关键字自定义函数(命名函数)
function fn(){
}
fn();
2.函数表达式(匿名函数)
var 变量名 = functino(){ };
例如
var fun = function(){
console.log('我是函数表达式');
}
fun();
注意:
(1)fun 是变量名,不是函数名
(2)函数表达式声明方式和声明变量差不多,只不过变量里面存的是值,而函数表达式里面存的是函数
(3)函数表达式也可以传参
四.作用域
概念同C,提高程序的可靠性,减少命名冲突
分为全局作用域和局部作用域。
全局作用域:整个script标签或者是一个单独的js文件内
局部作用域:(函数作用域)在函数内部就是局部作用域,这个变量的名字只在函数内部起效果和作用
类似的变量也分为全局变量和局部变量
注意:
1.在函数内部没有用 var 声明而是直接赋值的也是全局变量
2.函数的形参也可以看做局部变量
3.全局变量生命期长,比较占内存。
4.现阶段js(es6之前,es6表示版本)中没有块级作用域。
如
if (3 < 5){
var num = 10;
}
console.log(num);
//是会输出10,不会报错的
作用域链
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。根据在内部函数可以访问外部函数变量的这种机制,用链式查找来决定哪些数据能被内部函数访问,就称作作用域链。
如
var num = 10;
function fn(){
var num = 20;
function fun(){
console.log(num);
}
}
fn();
//结果为20,离得近的屏蔽离得远的,就近原则
五.预解析
我们js引擎运行js分为两步:预解析和代码执行
(1)预解析: js引擎会把js里面所有的var 还有 function 提升到当前作用域的最前面
(2)代码执行: 按照代码书写的顺序从上往下执行
其中 预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
(1)变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作。
(2)函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
// 1
console.log(num);
// 变量为声明,报错
// 2
console.log(num);
var num = 10;
// 结果为: undefined
// 相当于执行:
// var num;
// console.log(num);
// var num = 10;
// 3
fn();
function fn() {
console.log(11);
}
// 输出11
// 相当于执行:
// function fn() {
// console.log(11);
// }
// fn();
// 4
fun();
var fun = function(){
console.log(11);
}
// 报错
// 相当于执行:
// var fun;
// fun();
// var fun = function(){
// console.log(11);
// }
注意:
function f1(){
var a = b = c = 9;
// 相当于 var a = 9; b = 9; c = 9;
// b 和 c直接赋值 没有var 声明 当全局变量看
}
六.对象(object)
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串,数值,数值,函数等等。
例如
(1)明星不是对象,而迪丽热巴是对象
(2)女朋友不是对象,而xxx是对象
即对象是一个具体的事物,不能太抽象。实际上,根据我学的python,太抽象的话可以说成类。
对象由属性和方法组成。
创造对象的三种方法:
1.利用对象字面量来创建
如
var obj = {
uname: '张三疯',
age: 18,
sex: '男',
sayHi: function() {
console.log('hi~');
}
}
// (1)里面的属性或者方法我们采用键值对的形式,键是属性名,值是属性值
// (2)多个属性或者方法之间用,隔开
// (3)方法冒号后面跟的是一个匿名函数
// 调用属性的两种方法:
// (1)对象名.属性名 . 我们理解为的
console.log(obj.uname);
// (2)对象名['属性名']
console.log(obj['age']);
// 调用对象的方法 sayHi 对象名。方法名() 千万不要忘记添加小括号
obj.sayHi();
2.利用 new Object来创建,如
var obj = new Object();
obj.uname = '张三疯';
obj.age = 18;
obj.sex = '男';
obj.sayHi = function() {
console.log('hi~');
}
// (1)我们是利用等号 = 赋值的方法 添加对象的属性和方法
// (2)每个属性和方法之间用分号结束
// (3)调用同第一种方法创建的对象类似
console.log(obj.uname);
console.log(obj['sex']);
obj.sayHi();
3.利用构造函数创建对象
// 我们为什么需要使用构造函数
// 就是因为我们前两种创建对象的方法一次只能创建一个对象
// 我们可以利用函数的方法 重复这些相同的代码 我们就把这个函数称为 构造函数
// 构造函数 就是把我们对象里面的一些相同的属性和方法抽象出来封装到函数里面
// 语法格式:
// function 构造函数名() {
// this.属性名 = 属性值;
// this.方法名 = function() {}
// }
// new 构造函数名();
// 例如:
function Star(uname, age, sex) {
this.name = uname;
this.age = age;
this.sex = sex;
}
var ldh = new Star('刘德华', 18 ,'男');
console.log(ldh.name);
// 注意:
// 1.构造函数名首字母要大写
// 2.构造函数不需要 return 就可以返回结果