为何想要开一个javascript文集呢,主要是自己的js基础太差了,决定从0开始重新学习,用此系列博客记录我自己的学习路程。
值和引用
在javascript中,我们有两种方法来保存数据:值和引用。这里要提一下js的基本数据类型和引用类数据类型。
基本数据类型:Null,undefined,boolean,String,Number,以及es6新加的symbol(一但创建就不可修改)。
引用类数据类型:Object (Function,Array,Date,RegExp)。
对于基本类型,值都是直接赋值到变量中的;而对于引用类型,变量的值都是通过指针指向内存中的对象,同一个对象可能会有多个变量同时指向自身,当其中某个变量修改对象中的值时候,其他引用此对象的变量中的值也会相应得改变。
我们来看点代码示例:
var a = 5;
var b = 5;
a = 6;
console.log(b); // 这里的答案是5;因为a和b都是赋值为基本数据类型Number
var a = {};
var b = a;
b.addsth = something;
console.log(a.addsth);// 这里会发现a中也有了addsth属性。因为a和b都是对对象{}的引用。
var arr = [1, 2, 3];
var testarr = arr;
arr.push(4);
console.log(arr == testarr) // true,因为两者都是指向[1, 2, 3]这个数组对象。arr改变了原始引用对象值,导致testarr值也相应改变
var arr = [1, 2, 3];
var testarr = arr;
arr = [3, 3, 4];
console.log(testarr) // [1, 2, 3]
// 因为两者本来都是指向同一个数组对象,但后来arr的指向改变了,testarr并没有。
作用域
在es6之前,js中只有两种作用域,那就是全局作用域以及函数作用域,虽然如此,但使用要格外注意。
var a = '我是全局变量';
function abc () {
var a = '我是局部变量';
console.log(a) // 如方法abc调用,则答案是'我是局部变量'
}
console.log(a) // 答案是'我是全局变量';
if (true) {
var a = '我是新值'
}
console.log(a) // 答案是'我是新值';
但是在es6中,增加了块级作用域,并有了新的定义变量关键词‘let’;这样一来,上面代码修改后运行结果会有一点区别。
let a = '我是全局变量'
function abc () {
let a = '我是局部变量';
console.log(a) // 如方法abc调用,则答案是'我是局部变量'
}
console.log(a) // 答案是'我是全局变量';
if (true) {
let a = '我是新值';
console.log(a) // 答案是'我是新值'
}
console.log(a) // 答案是'我是全局变量';
下面的代码中,由于没有在函数中声明变量作用域,导致函数执行后,变量变成了全局作用域下的值
var a = 1;
function abc () {
a = 2
}
console.log(a); // 1
abc();
console.log(a); // 2
// 全局作用域下的a被函数中的变量修改了。
上下文
我们可以用this来访问上下文,this主要指向你代码所处的执行环境
var a = 123; // 全局变量a值是123
function change (x) {
this.a = x
}
change(222);
console.log(a); // a的值被修改为222
var obj = {
a: 10
}
obj.change = change
obj.change(20); // obj中a的值被修改为20,因为此时obj的change方法中的this,指向的是obj
说到改变this指向的方法,不得不说一下call(),和apply()两个方法:apply的参数是数组形式,call的参数是单个的值,除此之外在使用上没有差别,重点
理解这两个函数调用的 this 改变
function changeColor (color){
var this.style.color = color;
};
// 在window对象上调用的时候无法运行,因为window对象没有style属性
// 比如现在有个div
var div = document.getElementById('mydiv');
changeColor.call(div, 'black');
changecolor.apply(div,['black'])
闭包
闭包是一种手段:有权访问另一个函数作用域内变量的函数都是闭包。至少我是这么理解的~~
这里简单介绍一下,后面会有专门的学习。
function abc (){
var a = 123;
function cc () {
console.log(a);
}
return cc;
}
var myfun = abc();
myfun(); // 答案123
网友评论