1.构造函数(这个构造函数在开发的时候是很少使用的)
var fun =new Function('console.log("这是我的第一个函数");');
fun();
2.声明函数
function fun2(){
console.log(‘这是我的第二个函数 ——————’)
}
console.log(fun2)
3.函数表达式
var fun3=function(){
console.log('我是匿名函数中封装的代码');
}
fun3() //调用该函数
然后我们尝试给函数传入参数 我们这边该如何传值呢?
function sum (a,b){
console.log(a+b);
}
sum(1,2)
小提示:return后面的提示都不会执行 / return后面不跟值 那么他会输出undefined
下面说下break return continue
break 这个是直接跳出当前的循环 (比如:12345 中间3判断 输出结果 123)
continue 用于跳过当次循环 (比如:12345 中间3判断 输出结果 1245)
return 结束当前的循环 (比如:12345 中间3判断 输出结果 12)
55
匿名函数
立即执行函数 函数被定义了被立刻执行了
(function(){
alert('我是一个匿名函数');
})();
匿名函数这样的写法是直接被调用的
一个很奇葩的写法
(function(){
console.log('a='+a)
console.log('b='+b)
})(123,456)
这个返回出来的是 a=123 b=456
56
这边提及到了一个对象里面是可以放函数的
var obj =new Object();
obj.name='孙悟空'
obj.age=23
obj.sayName=function(){
console.log(obj.name)
}
obj.sayName() //返回的是一个函数
函数也是可以做为属性的
那么我们称这个函数的时候叫做这个对象的方法
调用的函数就是调用对象的方法(method)
个人理解(在我们正常开发的过程中 我们会使用到很多封装好的框架 这里大多都是对象的方法或者叫做对象的函数)
let obj ={
name:"猪八戒",
age:23,
}
for(var n in obj){
console.log('hello')
}
这个for in 会输出两个hello
语法:
for(var 变量 in 对象){
}
58
作用域 指的就是一个变量的作用范围
function fun(){
var a=123
}
fun()
console.log(a) //这边等于underfined 因为变量声明是在函数中
作用域中分为两种 1.全局作用域 2.局部作用域
1.全局作用域
全局作用域是编写在script标签中的 都是全局作用域
全局作用域在页面打开的时候打开 关闭的时候关闭
在全局作用域中有一个全局对象叫做 window 它是由浏览器创建的 我们是直接可以在浏览器中使用 的
2.局部作用域
局部作用域是在函数中定义的
例子
function fun (){
consloe.log("hahhaha ")
}
window.fun() //这个和fun()效果是一样的 当你创建一个方法的时候 也就是在window中创建了这个方法
我们所谓的函数就是window对象中 的方法
重点:这节课讲到了一个函数的声明提前的问题
就是大多数js代码都是代码是自上而下运行的
但是注意了 在非函数表达式声明的函数这块可不一样了 函数是可以声明提前的
59
函数作用域
调用函数的时候 创建函数作用域 函数执行完毕的之后 函数作用域摧毁
在函数作用域中 我们是可以访问到全局的变量 但是在全局作用域中 是无法访问到函数中的局部作用域成立的变量的
这里面讲到了一个函数作用域里面的一个声明提前的示例
var a = 0 //在全局声明一个a
function fun(){
console.log(a)
var a =123
}
fun(); //这个里面输出的书underfined
这个函数只能的var a被提前声明了
function fun(){
var a
console.log(a)
a =123
}
fun(); //这个里面输出的书underfined 也就是相当于这样
60
debug
这一集里面将的是浏览器中debug
61
this相关知识
根据函数的调用方式的不同 ,我们this会指向不同的对象
1.以函数的形式调用 this永远是window
2.以方法的形式调用时候,this就是调用方法的那个对象
当直接fun()调用函数的时候 返回的是 【object window】
但是我们将这个放到一个对象里面使用obj.sayName()去调用的时候 我们这边会发现结果为【object object】 这个现象我们应该怎么解释呢
62
this的相关补充
63
使用工厂函数的方式创建对象
他讲的就是一个函数里面封装一个对象 在调用函数的时候 给函数里面传值 就是这样的一个简单的东西 叫起来倒是挺高大上的
64
构造函数
function Person(){
}
var per=new Person() //调用构造函数的时候 前面是要加上new的
console.log(per) //这边直接就可以返回一个对象了
这里就涉及到一个知识点
1.当你调用一个函数的时候 这边就立马会创建一个对象
2.将新建的对象设置为我们函数的this
3.逐行执行我们函数中的代码
4.将新建的对象,作为返回值返回出来
function Person(){
this.name="孙悟空"
}
var per=new Person() //调用构造函数的时候 前面是要加上new的
console.log(per.name) //这边返回 孙悟空
console.log(per) //这边就是直接返回一个对象
65
没有意思
66
原型对象
原型prototype
我们创建的每一个函数,解析器都会向函数中添加一个属性 prototype
function person(){
}
consloe.log(person.prototype) //这边打印出来是一个对象【object object】
如果我们的函数就当普通函数调用这个没有什么效果
当函数通过构造函数调用的时候 它创建的对象中有一个隐含的函数
指向该函数的原型对象 我们可以通过_proto_来访问该对象
function MyClass(){
}
let mc =new MyClass()
console.log(mc.__proto__==MyClass.prototype) //我们就是这样访问的//true
原型对象就相当于一个公共区域,所有同一个类的实例都可以访问这个原型对象
我们可以将对象中共有的内容,同意设置在原型对象中
当我们访问对象的一个属性的时候 ,我们会先在对象自身中寻找,如果有则直接使用
如果没有的话 直接会在原型对象中寻找
function MyClass(){
}
MyClass.prototype.a=123
let mc=new MyClass()
console.log(mc.a) //123
以后我们创建构造函数时候 可以将这些对象共有的属性和方法 写在原型对象中
67
原型对象2
这边讲到了一个判断对象中有没有相关属性的方法 这个很有意思的 这边记录下
使用这个in检查我们的对象中是否有name这个字段 如果对象中没有 原型中有的话 也是会返回 true的
或者我们可以使用hasOwnpriperty("name") 来检查对象中是否含有该属性
但是使用该方法 只有我们对象中含有属性的时候 才会返回true 只有原型中有的话是false的
68
toString()
这边讲到了 使用tostring的使用 会变到原型对象里面 这样解决
69
垃圾回收机制(GC)
程序运行过程中是会产生垃圾的 当垃圾积攒过多的时候 我们代码的运行速度会变慢
因此我们需要垃圾回收的机制 来处理我们程序运行中产生的垃圾
当一个对象没有任何的变量或者属性对它进行引用 此时他就变为了垃圾 这种对象过多 会大量占用我们的内存空间 导致程序变慢 所以底下就抛出一个问题 这个垃圾怎么清理????
然后他说js会自己处理垃圾 看了个寂寞。。。。。。。。。。。。。。