Function类型

函数function不需要返回类型(不是没有返回值),参数也不需要指定类型,更为特殊的是函数竟然是个类,可以通过new出来

var box= new Function('num1', 'num2' ,'return num1 + num2');

这样的写法是完全正确的,但不推荐使用,因为会解析两次(第一次解析JavaScript代码,第二次解析参数)造成性能问题

function可以当做参数使用

(很怪异,方法作为参数, 可以理解成把函数的引用作为参数)

function box(sumFunction,num){            //将函数作为参数使用
return sumFunction(num);
} function sum(num){
return num+10; //需要返回
} alert(box(sum,10));

函数内部属性

在函数内部,有两个特殊的对象:argumentsthis

arguments 是一个类数组对象,包 含着传入函数中的所有参数,主要用途是保存函数参数。但这个对象还有一个名叫 callee 的 属性,该属性是一个指针,指向拥有这个 arguments 对象的函数

一个递归方法(可以使用arguments.callee方法代替调用本身)

function box(num){
if(num<=1){
return 1;
}else{
//return num*box(num-1);
return num*arguments.callee(num-1);
}
} alert(box(3));

函数内部另一个特殊对象是 this,其行为与 Java 中的 this 大致相似。this 引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域,当在全局作用域中调用函数时,this 对象引用的就是 window

var color='红色的';             //作用域
alert(this.color);
var box={
color:'蓝色的',
sayColor:function(){
alert(this.color);
}
};
box.sayColor();

第一个this引用的是全局window,而第二个this引用的是box本身这个对象

函数属性和方法

JavaScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性: length prototype

length 属性表示函数希望接收的命名参数的个数

function box(name, age) {
alert(name + age);
}
alert(box.length); //

prototype 属性,它是保存所有实例方法的真正所在,也就是原型。 prototype 下有两个方法:apply() call(),每个函数都包含这两个非继承而来的方法。这两个方法的用途都在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值

apply()方法:

function box(num1,num2){
return num1+num2;
} function sayBox(num1,num2){
return box.apply(this,[num1,num2]); //第二个参数是数组
} function sayBox2(num1,num2){
return box.apply(this,arguments); //可以使用arguments替代参数列表
} alert(sayBox2(10,10));

call()方法:

function box(num1,num2){
return num1+num2;
} function sayBox(num1,num2){
return box.call(this,num1,num2); //使用call方法传值不可以使用arguments
} alert(sayBox(10,10));

call()方法于 apply()方法相同,他们的区别仅仅在于接收参数的方式不同。对于 call()方法而言,第一个参数是作用域,没有变化,变化的只是参数传递的方式

但事实上,传递参数并不是 apply()和 call()方法真正的用武之地;它们经常使用的地方是能够扩展函数赖以运行的作用域(对象冒充)

var color='红色的';
var box={
color:'蓝色的'
};
function sayColor(){
alert(this.color);
}
sayColor.call(this); //红色的
sayColor.call(window); //蓝色的
sayColor.call(box); //apply和call方法的真正作用在于使对象和对象里的方法解耦合

变量与作用域

JavaScript 变量可能包含两种不同的数据类型的值:基本类型值和引用类型值。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。 而引用类型值则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象(和Java的处理方式类似)

变量

对于变量类型和操作上和其他语言没有太大的差别,但需要注意基本类型和引用类型赋值操作的不同

//基本类型
var box='lee';
var box2=box; //不同的,相互独立的两个空间
box='alert'; //改变不会相互影响
alert(box);
alert(box2); //引用类型
var box={
name:'lee'
};
var box2=box; //不同的空间,相同的内容(同一个引用地址)
box.name='alert'; //改变会相互影响
alert(box.name);
alert(box2.name);

事实上Java中的类型也是这样操作的

可以检测变量类型,使用typeof或instanceof

var arr=[1,2,3];
//alert(typeof arr); //typeof检测引用类型会出现 数组,对象,null都是object的问题,具体类型不知道
alert(arr instanceof Array); //使用instanceof检测引用类型 var box='lz';
//var box=new String('lz');
alert(box instanceof String); //但是instanceof检测基本类型会返回false.在这里如果String是new出来的,也会返回true
//alert(typeof box); //建议对基本类型的检测使用typeof ,对应用类型检测使用instanceof
//Java也用instanceof检测类型,用法一致,但没有typeof

作用域

作用范围上其实与其他语言挺不同的,判断和循环语句的花括号竟然不能限定作用域

if(true){                  //判断语句的花括号没办法限定其中值得作用域
var i=10;
}
alert(i); // for(var i=0;i<10;i++){ //循环语句的花括号也没办法限定其中值得作用域
var box='lz';
}
alert(i); //
alert(box); //lz function box(){ //只有function函数的花括号可以限定作用域
var i=10;
}
alert(i); //报错

还有就是this在全局的范围代表的window对象

var color='红色的';             //作用域
alert(this.color);
var box={
color:'蓝色的',
sayColor:function(){
alert(this.color);
}
};
box.sayColor();
alert(this.color); //红色的 等同于alert(window.color);

传递参数

JavaScript中所有函数的参数都是按值传递的,参数不会按引用传递,虽然变量有基本类型和引用类型之分,其实C++,java都是按值传递的,PHP是两种方式都有

function box(num) { //按值传递,传递的参数是基本类型
num += 10; //这里的 num 是局部变量,全局无效
return num;
}
var num = 50;
var result = box(num);
alert(result); //
alert(num); //

以上的代码中,传递的参数是一个基本类型的值。而函数里的 num 是一个局部变 量,和外面的 num 没有任何联系

容易混淆的是下面的代码

function box(obj) { //按值传递,传递的参数是引用类型
obj.name = 'lz';
}
var p = new Object();
box(p);
alert(p.name); //lz

结果改变了,这是因为我们按值传递一个地址的引用(可以这样理解),然而存在了不同空间,相同的内容(同一个引用地址),就会相互影响

包装类

为了便于操作基本类型值,JavaScript提供了 3 个特殊的引用类型:Boolean、Number 和 String。这些类型与其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。 实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象, 从而能够调用一些方法来操作这些数据,所以才可以向下面一样操作:

//var str='Mr.li';
//alert(str.substring(2));
alert('Mr.li'.substring(2)); //根据指定位置向后截取

这三个包装类提供了丰富的方法和属性来操作它们对应的基本类型,这里不一一记录了

JavaScript笔记——基础知识(二)的更多相关文章

  1. 快速掌握JavaScript面试基础知识(二)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

  2. JavaScript笔记基础篇(二)

    基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...

  3. JavaScript笔记——基础知识(一)

    <Script>标签属性 <script>xxx</script>这组标签,是用于在 html 页面中插入 js 的主要方法.它主要有以下 几个属性: charse ...

  4. 快速掌握JavaScript面试基础知识(三)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

  5. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  6. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  7. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  8. javascript的基础知识及面向对象和原型属性

    自己总结一下javascript的基础知识,希望对大家有用,也希望大家来拍砖,毕竟是个人的理解啊 1.1 类型检查:typeof(验证数据类型是:string) var num = 123; cons ...

  9. Dapper基础知识二

    在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper?     首先Dapper是支持多种数据库的 ...

随机推荐

  1. Python 导出数据from Mysql

    环境 Anaconda3 Python 3.6, Window 64bit 目的 从MySQL数据库读取目标表数据,并处理 代码 # -*- coding: utf-8 -*- import pand ...

  2. 51nod 1326 奇妙的spfa+dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1326 1326 遥远的旅途 题目来源: TopCoder 基准时间限制: ...

  3. 【scala】模式匹配

    Scala的模式匹配是通过match表达式从若干可选项中选择,类似Java中的switch. 例子: val firstArg = if(args.length>0) args(0) else ...

  4. Ajax传输对象,集合或数组。

    传输单个对象时: servlet页面 package com.itnba.maya.a; import java.io.IOException; import javax.servlet.Servle ...

  5. Python基础学习(第9天)

    第九课:动态类型 1.在Python中,有一类特殊的对象,是专门用来存储数据的,常见的有数字.字符串.数列.字典等.这些对象是存储在内存中的实体,我们并不能直接接触到它们,在程序中接触的是对象名,是指 ...

  6. Juint 单元测试(2)

    单元测试(junit testing),是指对软件中的最小可测试单元进行检查和验证.Java里单元指一个类. JUnit ,是一个开源的Java单元测试框架,是 Java的标准单元测试库,是非常重要第 ...

  7. Windows10使用Chocolatey安装mysql之后无法使用的解决办法

    问题背景:使用了一台新的虚拟机,并且安装了Chocolatey作为Windows的包管理器,之后安装mysql 那么问题发生了,使用mysql命令根本没有任何反应,也不报错,但是安装的时候是提示安装成 ...

  8. 类里边的构造函数可以被private修饰,在类的内部创建对象。利用这种特性创建单类模式

  9. Struts2常用标签总结

    Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...

  10. C# 操作自定义config文件

    示例文件:DB.config 1.读取 //先实例化一个ExeConfigurationFileMap对象,把物理地址赋值到它的 ExeConfigFilename 属性中: ExeConfigura ...