函数数据库
函数:函数就是封装了一段能够重复执行的代码块。数组
function fn(){ console.log('我是函数') } fn(); function getSum(a,b){ return a +b; } console.log(getSum(1, 2));
返回值浏览器
function fn2(){ alert('fn2内部的代码') } console.log(fn2()) //先弹出'fn2内部的代码',而后控制台打印undefined 小细节 : break ,continue ,return 的区别 break 结束当前的循环体 (for while ) continue 跳出本次循环,继续执行下次循环(for while ) return 返回return 中的值 同时结束当前的函数体内的代码
arguments的使用服务器
JavaScript中,arguments对象是比较特别的一个对象,其实是当前函数的一个内置属性。也就是说全部函数都内置了一个arguments对象,arguments对象中存储了传递的全部的实参。arguments是一个伪数组,所以及能够进行遍历函数
伪数组定义:学习
a.具备length属性;
b.按索引方式储存数据;
c.不具备数组的push,pop等方法;this
当咱们不肯定有多少个参数传递的时候,能够用arguments 来获取code
定义函数有两种方式对象
// 命名函数 有函数名 为 fn function fn() { ....} // 调用 那个地方调用均可以 fn()
语法格式:索引
// 这是 函数表达式 写法 匿名函数后面跟分号结束 var fn = function () { .... }; // 调用的方式 可是这个方式,函数调用必须写到函数体下面 fn();
自执行函数(了解)
(function () { alert('我是匿名函数,被自执行啦~~!'); })();
匿名函数自动执行写法的,最大的好处,就是 防止命名冲突, 这种函数永远不会冲突。
值类型和引用类型
var num1 = 10; var num2 = num1; num1 =20; console.log(num1); //20 console.log(num2); //10
栈速度比堆快。
fnuction Person(name,age){ this.name = name; this.age = age; } var p1 = new Person('zs',18); var p2 = p1; //复制引用 p2.name = 'ls'; console.log(p1.name); //ls console.log(p2.name); //ls
做用域
全局变量和局部变量
注意
在函数内部不声明直接赋值使用的变量也算是全局变量
函数的形参实际上就是局部变量
局部变量当其所在的代码块被执行时,会被初始化,当代码块运行结束后,就被销毁了,节省内存空间。
全局变量由于任何一个地方均可以使用,只有再浏览器关闭才会销毁,比较占内存。
只要是代码,就至少有一个做用域
写在函数外部的是全局做用域
写在函数内部的局部做用域
若是函数中还有函数,那么在这个做用域中就又能够诞生一个做用域。
根据在内部函数能够访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。 就称做做用域链。
局部变量,写在函数内部,当咱们函数执行完毕后,里面的局部就会自动销毁,释放内存,比较节省资源。
全局变量 只有浏览器关闭的时候才会销毁,比较浪费资源。
做用域链:咱们按照链式方式去查找,最终决定咱们变量执行那个值的过程(就近原则)
预解析
JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码的时候,分为两步:预解析和代码执行
学习预解析可以让咱们知道 为何在变量声明以前访问变量 值是undefined 为何在函数声明以前就能够调用函数
预解析过程
预解析也叫作变量、函数提高
执行过程
console.log(num2); var num2 = 20; //至关于执行了下面的代码 var num2; console.log(num2); //undefined; num2 = 20;
什么是对象?
对象调用:
console.log(star.name) // 调用 名字属性 console.log(star.age) // 调用 年龄属性 star.sayHi(); // 调用 sayHi 方法 注意,必定不要忘记带后面的括号
函数和方法的区别:
new Object 建立对象
var stuObj = new Obect(); stuObj.name = 'james'; stuObj.age = 11; stuObj.sex = true; stuObj.sayHi = function(){ alert('你们好啊~'); }
自定义构造函数
咱们能够和之前封装函数同样, 想建立多个对象,不用一个个的创造对象了。
抽象能够将具备相同或类似功能的js代码独立出来封装成一个函数,这样能够提升代码的重复利用率,提升代码书写的效率,也能够有效的减小代码的冗余。
咱们这个函数里面封装的对象, 为了和之前区别显示不一样。 咱们称为构造函数。
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.sayHi = function() { alert('个人名字叫:' + this.name + ',年龄:' + this.age + ',性别:' + this.sex); } } var bigbai = new Person('大白', 100, '男'); var smallbai = new Person('小白', 21, '男'); console.log(bigbai.name); console.log(smallbai.name);
new在执行时会作四件事情
this详解
JavaScript中的this指向问题,有时候会让人难以捉摸,随着学习的深刻,咱们能够逐渐了解
如今咱们须要掌握函数内部的this几个特色
1. 函数在定义的时候this是不肯定的,只有在调用的时候才能够肯定
2. 通常函数直接执行,内部this指向全局window
3. 函数做为一个对象的方法,被该对象所调用,那么this指向的是该对象(谁调用指向谁)
4. 构造函数中的this 对象的实例
// 1. 普通函数 function fn() { console.log(this); // this 指向 window } fn(); // 2 对象方法 var obj = { name: 'zs', dance: function() { console.log(this); that = this; } } obj.dance(); // this 指向 obj console.log(that === obj); // true // 3 构造函数 function Fn() { this.age = '18'; console.log(this) self = this; } var demo = new Fn(); // this 指向 demo console.log(self === demo); // true
对象是封装了相关属性和方法的复杂数据类型
本质:对象就是一组无序的相关属性和方法的集合
注意: 函数用来按功能封装代码,对象用来按功能封装方法和属性,都起到复用代码和数据的做用。