函数
JavaScript有一些内置函数:alert、prompt、console等。
我们可以自定义函数使用: 函数名()
声明函数
function fun(){
console.log("鹅鹅鹅,曲项向天歌");
console.log("白毛浮绿水,红掌拨清波");
}
调用函数
fun();//函数的调用
带参数的函数
function sum(a,b){//形参
console.log(a+b);
}
sum(2,3);//实参
局部变量
JavaScript中只有两种局部变量:作为函数形参、在函数体中声明变量。
处理局部变量都是全局变量。
function fun(a,b){
console.log(a);
console.log(b);
var i = 9; // 局部变量
}
fun("打豆豆","吃饭");
console.log(i); // 异常 Uncaught ReferenceError: i is not defined
作用域
全局作用域:你可以理解为两个双闭合标签script之间
函数作用域:函数体
没有重载
JavaScript中没有重载的概念,如果有多个重名的函数,永远是后者覆盖前者。
函数的型参多,只传入一部分。
调用的实参比形参多,只传入与形参个数相同的部分。
function fun1(a,b){
console.log(a);
console.log(b);
}
function fun1(a){
console.log(a);
}
fun1("fafsd")
fun1("123","4563")
关键字return
结合函数一起使用,可以将函数计算完记过返回,和java中相同。
函数上下文
函数上下文即为this,它只能在函数体中使用,它代表的数值并不是一个固定数值,函数上下文数值取决函数该如何调用执行。
函数的执行方式:
- 函数名+小括号 ;
- 函数作为事件处理函数执行;
- 定时器回调函数执行;
- 函数作为数组元素枚举出来执行;
- 函数作为对象方法执行 。
- new
function fun(){
//这个this是函数上下文
console.log(this);//window
}
fun();
var div = document.getElementById("box");
//事件处理函数
div.onclick = function(){
console.log(this);// 绑定的标签,上下文是div
}
//定时器回调
//参数(函数、时间)
setInterval(function(){
console.log(this);//window
},5000);
//函数作为数组的元素枚举
var arr = [1,2,3,4,function(){
console.log("i")
},function(){
console.log(this)//当前数组
},7,8,9];
arr[4]();
arr[5]();
//函数作为对象的方法执行.
var obj = {
name:"dsh",
age:24,
run:function(){
console.log("learn");
console.log(this);//当前对象
}
}
obj.run();
//构造函数
function Fun(){
//创建了一个空的狭义对象,一个{},this指向这个大括号
console.log("执行");
console.log(this);
}
new Fun;
构造函数
构造函数【constructor】两个特征:
- 函数名字首个英文字母一般需要大写;
- 构造函数必须是由关键字new调用的。
普通函数能干什么,构造函数就能干什么。构造函数也可以看做类,es6直接Class People{ constructor(){ } }
//问题:老师函数名+小括号调用函数执行、new调用函数也执行,两者也有什么区别呀?
function People(){
//第一步:在函数体中神秘创建了一个空的狭义对象【大的花括号】
//第二步:函数体种上下文指向当前这个空的狭义对象
//第三步:可以通过点语法给狭义对象动态添加属性、方法
this.xingming = "小明";
this.age = 18;
this.sex = "男";
this.hobby = ['吃饭','睡觉','打豆豆'];
//第四步:虽然没有关键字return,但是系统回自动将狭义对象返回
}
var obj = new People;
console.log(obj);
// 可以动态给对象添加方法。
obj.eat = function(params) {
console.log(params);
}
obj.eat("ff");
原型链
prototype
- 任意构造函数天生都有一个prototype属性,指向一个空的狭义对象,而这个对象正是调用构造函数时创建的实例的原型。
- 实例天生拥有一个
__proto__
属性,可以向上面的狭义对象借用方法使用。或者说每一个实例对象都会从原型中“继承”属性。
function Dog(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age
}
//使用原型添加方法
Dog.prototype.eat = function(){
console.log("fsfd");
}
var erha = new Dog("er","man",44);
erha.eat();