全局变量、局部变量:
JavaScript解释器在执行任何代码之前会先创建一个全局对象(global object),全局变量就是相当于这个全局对象的一个属性。
JavaScript中的全局对象为window,在它下面定义的变量为全局变量,一般定义在最外层的作用域中。
举例说明。
// 定义在最外层的作用域,全局变量
var num = 11;
function fn(aaa) {
// 定义在函数内,局部变量
var str = "JavaScript";
// 参数aaa的作用域在函数内,所以也是局部变量
console.log(aaa);
}
自由变量:
自由变量是相对而言的。
子作用域内可以取到父作用域内的变量,这个变量相对子作用域而言,就是自由变量。
举例说明。
// 定义在最外层的作用域,全局变量
var num = 11;
function fn() {
// num是父作用域的变量,相对于函数fn来说,他就是自由变量
console.log(num);
}
静态变量:
静态变量即为某个类所拥有的属性,通过“类名.静态变量名”的方式访问该属性。
举例说明。
// 定义Person的构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
// 此时gender属性为静态变量
Person.gender = "男";
// 通过new关键字生成一个Person实例
var tom = new Person("tom", 11);
console.log(Person.gender); // 男
console.log(tom.gender); // undefined
// 修改静态变量gender
Person.gender = "女";
console.log(Person.gender); // 女
通过以上例子说明,静态变量不能通过“实例.静态变量名”调用,只能通过“类.静态变量名”调用。
静态方法:
同理,静态方法为某个类所拥有的方法,通过“类名.静态方法名”的方式调用该方法。
举例说明。
// 定义Person的构造函数
function Person() {
this.sayHello = function () {
console.log("Hello");
};
}
// 此时fn方法为静态方法
Person.fn = function () {
console.log("静态方法");
};
// 通过new关键字生成一个Person实例
var tom = new Person("tom", 11);
Person.fn(); // 静态方法
// tom.fn(); // TypeError: tom.fn is not a function
// 修改静态方法fn
Person.fn = function () {
console.log("静态方法已被修改");
};
Person.fn(); // 静态方法已被修改
通过以上例子说明,静态方法不能通过“实例.静态方法名”调用,只能通过“类.静态方法名”调用。
个人学习总结,欢迎批评指正