JavaScript基础知识补习(2)

(声明:仅仅为博主的学习记录整理)

2018/8/16 杂乱整理


函数
-函数也是一个对象
-函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)

//可以将要封装的代码以字符串的形式传递给结构函数
var fun = new Function();
//函数声明
function fun2(){}       
//赋值语句 匿名函数给一个变量
var fun3 = function(){};
//两个其实差不多
//调用
fun2();
fun3();

函数的参数
可以在函数的()中来指定一个或多个形参(形式参数)
多个形参之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量,但是并不赋值

function sum(a+b){
    console.log(a+b);
}
//在调用函数时,可以在()中指定实参(实际参数)
//实参将会赋值给函数对应的形参
sum(1,2);  //3

调用函数时解析器不会检查实参的类型
所以要注意,是否有可能会接收到非法的参数

调用函数时解析器也不会检查实参的数量
多余的实参不会被赋值
如果实参数量少于形参的数量,则没有对应实参的形参将是undefined


返回值:

 语法:
      return  值;

return语句后不跟任何置就相当于返回一个undefined
函数中不写return也返回undefined

var result = alert("hello"); //是个函数!相当于没有返回值!
console.log("result = " + result); //undefined

笔记中的例子

<!DOCTYPE html>
<html>
<body>
    <script type="text/javascript">
    function sayHello(o){
        console.log("我是"+o.name+",我今年"+ o.age + "岁了," + "我住在" + o.address + ",我是一个" + o.gender);
    }
    var obj = {
        name:"bboy",
        age:19,
        address:"montents",
        gender:"boy"
    };

    //sayHello(obj);
    //实参可以是一个对象,也可以是一个函数

    function fun(a){
        console.log("a = " + a);
        //a(obj);                     //这里这个意思是sayHello(obj)
    }

    //fun(sayHello);                 //上面那句注释和下面这个结合看因为形参a被赋予了sayHello这个实参函数
    fun (function(){
        aler("hello")
    });
        //将一个函数作为实参传给函数
        //对象可以做的函数都能做
    </script>

</body>
</html>

立即执行函数(!!!以前没印象)

<!DOCTYPE html>
<html>
<body>
  <script>
  //函数对象()
  //函数定义完立即被调用
  //往往只会执行一次
    (function(){
      alert("我是一个匿名函数");
    })();    //注意这里的()
  </script>
</body>
</html>

方法:
函数也可以成为对象的属性
如果一个函数作为一个对象的属性保存
那么我们称这个函数是这个对象的方法
调用函数就说调用对象的方法(method)

但是它只是名称上的区别没有其他的区别 本质还是一样的

console.log() colsole对象的log方法
document.write() 同理
“hello”.toString() 同理


枚举对象中的属性

你不知道对象中的属性有些什么,那就从中取出来,那就去枚举对象中的属性。
使用 for···in 语句
语法:

for(var 变量 in 对象){
     ···
}

我们给个简单的例子

var obj = {
  age:18,
  name:bboy,
  sex:boy
};
for(var n in obj){
    console.log("属性名:"+n);
    //下面这句这样是不行的哈是undefined
    console.log(obj.n); 
    console.log("属性值:"+obj[n]);
}

其中的obj[n] ——>
特殊属性名的使用,不能用.n
语法:
对象[“属性名”] = 属性值

obj["123"]=99;
console.log(obj["123"]); //99   相当于字符串123

作用域
作用域指一个变量的作用的范围
在JS中一共有两种作用域

    1.全局作用域
        -直接编写在script标签中的代码,
        - 全局作用域在页面打开时创建,在页面关闭时销毁
        - 在全局作用域中有一个全局对象window,
               它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用。
        -在全局作用域中:
            创建的变量都会作为window对象的属性保存
            创建的函数都会作为window对象的方法保存
        -全局作用域中的变量都是全局变量
  2.函数作用域
        -调用函数时创建函数作用域,函数执行完毕以后,,函数作用域销毁
        -每调用一次函数就会创建一个新的作用域,他们之间是互相独立的
        -在函数作用域中可以访问到全局作用域的变量
            在全局作用域中无法访问到函数作用域的变量
        -当函数作用域操作一个变量时,他会先在自身作用域中寻找,套娃形式···然后全局作用域都还没有就报错:ReferenceError
        -在函数中要访问全局作用域可使用window
        -在函数作用域中也有声明提前的特性
            函数声明也会在所有代码执行之前执行
        - 在函数中,不使用var声明的变量都会成为全局变量

变量的声明提前 :
使用var关键字声明的变量,会在所有的代码执行之前被声明(但不会被赋值)。
但是如果声明变量时不使用var 关键字,则变量不会被声明提前。

console.log("a="+a);
a = 123;             //报错
console.log("a="+a);    //undefinde   变量的声明提前
var a = 123;             

函数的声明提前 :
使用函数声明形式创建的函数function 函数(){},他会在所有代码执行之前就被创建,所以可以在函数声明前调用函数

我们给出两个例子理解一下

fun(); //fun
fun2(); //报错 undefined is not a function
console.log(fun2); //undefined
function fun(){
    console.log("fun");
}
//函数表达式不会被提前
var fun2 = function(){
    console.log("fun2");
}


// - d没有使用var关键字,则设置为全局变量
// - 在函数中,不使用var声明的变量都会成为全局变量

function fun(){
    d = 100;   //相当于window.d = 100;
}
fun();
console.log("d="+d); //d=100 这个100是从全局中读取的

var e = 20;
//定义形参就相当于在函数中声明了变量
function fun2(e){   
alert(e);
}
fun2();   //undefined

debug:
让程序停住
断点查看执行流程
保存后按F12体验一下叭

alert(d);  //undefined
alert(c);  //报错
var a = 10;
var b ="hello";
c = ture;
function fun(){
    alert("hello");
}
var d = 35;

this

解析器在调用函数每次都会向函数内部传递一个隐含的参数
这个隐含参数就是this,this指向的是一个对象
这个对象我们称为函数执行的 上下文对象,
根据调用的对象不同,this会指向不同的对象
1.以函数形式调用时,this永远都是window
2.以方法形式调用时,this就是调用方法的那个对象

function fun(a,b){
  //console.log("a = "+a", b = "+b);
    console.log(this);                  //object Window
}
fun(123,456);
function fun(a,b){
  //console.log("a = "+a", b = "+b);
    console.log(this);                  //object Window
}

var obj = {
 name:"swk",
 sayName:fun
 };

 obj.sayName();  //swk    此时this为obj这个对象 
 fun();          //window 此时thiswindow

this由浏览器传过来的

猜你喜欢

转载自blog.csdn.net/qq_39317423/article/details/81740030