深度理解javascript函数

理解javascript函数的关键就是抛弃主流面向对象语言中“类”的观念。

主流的面向对象语言,例如C++,先写好“类”的定义。当需要对象时,用new关键字去划出一片内存来,赋上初值,就有了一个对象(“类”的“实例”)。混淆的来源是javascript语言模仿了面向对象的语法,看到Object,new之类的关键字,很难不让人去联想那些传统的面向对象的经典概念。

我们可以优雅的模仿“类”的观念,但是始终要提醒自己,javascript只有对象,没有类。

//Animal是一个对象
Animal = {
    createNew: function( bundle ) {
        var animal = {};
        var protect = bundle || {};//bundle传递的是指针,修改protect时外面对象会跟着变(除非不传)
        protect.sound = 'growl';
        protect.makeSound = function(){
            return protect.sound;
        }
        return animal;
    }
}     

//Cat也是一个对象
Cat = {
    createNew: function(mySound) {
        var protect = {};
        var cat = Animal.createNew( protect );//protect会被修改,然后返回空白对象{}给cat
        protect.sound = mySound;
        cat.meow = function(){ return protect.makeSound(); };//cat要调用protect中的方法
        return cat;
    }
}     

//javascript区分大小写,通过Cat对象构造一个新的对象赋值给cat
var cat = Cat.createNew("meow!");
pt("cat.sound");//cat不能直接访问sound
pt("cat.meow()");//通过函数可以访问sound
var bigCat = Cat.createNew("meow!meow!meow!");
pt("bigCat.sound");//bigCat也不能直接访问sound
pt("bigCat.meow()");//通过函数可以访问sound

调试信息:

cat.sound undefined

cat.meow() meow!

bigCat.sound undefined

bigCat.meow() meow!meow!meow!

[备注] 如果希望大猫(bigCat)小猫(cat)有公共的属性,因为Cat本身也是一个对象,所以可以在Cat中定义对象作为公共属性,并在createNew中增加操纵此公共属性的函数。

模仿“类”的观念让我联想到了东施效颦的典故。东施模仿西施优雅的举止肯定是不能达到西施的水准,但是东施难道就没有自己的特长么?例如,做家务会不会比西施更能干呢?javascript函数最大的好处就是可以赋值给变量,因而我们可以编写“函数的函数”,或者,把函数当参数传来传去,函数也可以有自己的方法,诸如此类。还记得在学习早期结构化的编程语言(例如Fortran和C)时,被纠正说不能传递函数当参数么?

Function.prototype.run=function(){
    return "run~~";
}
pt("cat.meow.run()");//函数也可以有方法

调试信息:

cat.meow.run() run~~

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
, 对象
, 面向对象
, 函数
, sound
cat
javascript 深度拷贝、javascript深度克隆、javascript深度解析、javascript 深度学习、javascript 深度遍历,以便于您获取更多的相关知识。

时间: 2024-08-30 19:46:31

深度理解javascript函数的相关文章

深入理解JavaScript 函数_基础知识

方法&函数 区别 1.function 是更通用的概念,如数学.编程 2.method 是面向对象中的概念,一般与类或对象成对出现 关系 1.对象的属性可以是任意类型 2.对象的属性如果是函数类型,它就叫做这个对象的方法 3.所以方法的本质还是函数 函数的调用 1.fun() 2.obj.fun() 3.fun.call() 函数的属性和方法 1.name 2.length 3.toString 作用域 变量不是哪里都可以使用 全局变量(跨文件) var n = 1; function fn()

深入理解JavaScript函数参数(推荐)_javascript技巧

前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascript中的函数定义并未指定函数形参的类型,函数调用也未对传入的实参值做任何类型检查.实际上,javascript函数调用甚至不检查传入形参的个数 function add(x){ return x+1; } console.log(add(1));//2 console.log(add('1'));/

深入理解javascript函数参数与闭包_javascript技巧

最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把学习的过程整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径,避免走弯路.内容有些多,但都是笔者对于函数的总结. 1.函数参数 1.1:参数是什么 1.2:参数的省略 1.3:参数默认值 1.4:参数传递方式 1.5:同名参数 1.6:arguments对象 2.闭包 2.1:闭包定义 2.2:立即调用的函数表达式(IIFE, Immediately

理解javascript 回调函数

在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A.我们就说函数A叫做回调函数.如果没有名称(函数表达式),就叫做匿名回调函数.因此callback 不一定用于异步,一般同步(阻塞)的场景下也经常用到回调,比如要求执行某些操作后执行回调函数. 例子 一个同步(阻塞)中使用回调的例子,目的是在func1代码执行完成后执行func2. var func1=function(callback){     //do something

AJAX入门之深入理解JavaScript中的函数

ajax|javascript|函数 概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法: function func1(-){-}var func2=function(-){-};var func3=function func4(-){-};var f

新手入门:理解JavaScript中函数的使用

javascript|函数 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解. JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法: function func1(-){-} var func2=function(-){-}; var func3=function func4(-){-}; var func5

深入理解JavaScript中的箭头函数_基础知识

从一开始箭头就是 JavaScript 的一部分,在第一个 JavaScript 中就建议将内联的脚本代码包裹在 HTML 的注释中,这可以防止那些不支持 JavaScript 的浏览器错误滴将你的代码显示为明文.你也许写过下面这样的代码: <script language="javascript"> <!-- document.bgColor = "brown"; // red // --> </script> <scri

深入理解JavaScript系列(4) 立即调用的函数表达式_javascript技巧

前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下"自执行"这个叫法,本文对这个功能的叫法也不一定完全对,主要是看个人如何理解,因为有的人说立即调用,有的人说自动执行,所以你完全可以按照你自己的理解来取一个名字,不过我听很多人都叫它为"自执行",但作者后面说了很多,来说服大家称呼为"立即调用的函数表达式". 本文英文原文地址:http://benalman

深入理解JavaScript系列(2) 揭秘命名函数表达式_javascript技巧

前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简单的说,命名函数表达式只有一个用户,那就是在Debug或者Profiler分析的时候来描述函数的名称,也可以使用函数名实现递归,但很快你就会发现其实是不切实际的.当然,如果你不关注调试,那就没什么可担心的了,否则,如果你想了解兼容性方面的东西的话,你还是应该继续往下看看. 我们先开始看看,什么叫函数表达式,然后再说一