把一个函数对象赋值给变量后,就可以通过这个变量再次定义函数,甚至可以在一个函数内部再次定义它自己:

  1. var scareMe = function () {
  2. alert("Boo!");
  3. scareMe = function () {
  4. alert("Double boo!");
  5. };
  6. };
  7. // using the self-defining function
  8. scareMe(); // Boo!
  9. scareMe(); // Double boo!

如果你需要在一个函数第一次执行的时候做一些特别的事情,就可以使用这种模式。但如果把这个变量赋值给另一个对象再执行,或是把它作为一个对象的方法执行,这种模式有可能会失效,考虑下面的代码:

  1. // 1. adding a new property
  2. scareMe.property = "properly";
  3.  
  4. // 2. assigning to a different name
  5. var prank = scareMe;
  6.  
  7. // 3. using as a method
  8. var spooky = {
  9. boo: scareMe
  10. };
  11.  
  12. // calling with a new name
  13. prank(); // "Boo!"
  14. prank(); // "Boo!"
  15. console.log(prank.property); // "properly"
  16.  
  17. // calling as a method
  18. spooky.boo(); // "Boo!"
  19. spooky.boo(); // "Boo!"
  20. console.log(spooky.boo.property); // "properly"
  21.  
  22. // using the self-defined function
  23. scareMe(); // Double boo!
  24. scareMe(); // Double boo!
  25. console.log(scareMe.property); // undefined

这种模式的核心就是secareMe存放的是一个函数对象的引用,而这个引用在原来的函数对象中被修改。所以当这个函数对象的引用被赋值给另一个变量 prank时,就不能通过secareMe来修改parnk的引用,所以模式就失效了。这也体现了JavaScript里函数是一个对象的事实。

JavaScript基础-自己定义自己的函数(016)的更多相关文章

  1. JavaScript基础5——关于ECMAscript的函数

    ECMAScript的函数概述(一般定义到<head>标签之间) (1)定义函数,JavaScript一般有三种定义函数方法: *第一种是使用function语句定义函数(静态方法) fu ...

  2. JavaScript基础知识(对象、函数与对象)

    17.对象 属性:描述对象的信息  方法:描述对象的行为  封装:只关心输入和输出(不管过程如何实现) ü 对象的分类: 内置对象(原生对象): 就是JavaScript语言预定义的对象(如Strin ...

  3. javascript基础一语法和常用函数

    1语法 1.1引入的方式 在html中引入javascript,使用script标签,在html页面中包括外部引入js方式和在html内部引入js方式.如下两种: 方式一: <script ty ...

  4. JavaScript基础11——js的全局函数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. JavaScript基础笔记(五) 函数表达式

    函数表达式 一.闭包 概念:闭包是指有权访问另一个函数作用域中变量的函数. function createCompareFun(propertyName) { return function (obj ...

  6. JavaScript | 基础(变量/引用/转换/函数)

    ———————————————————————————————————————————— 变量 全局变量:在函数体外声明,全局可以使用 局部变量:通过关键字var来声明 变量类型 <script ...

  7. 【javascript基础】2、函数

    前言 我在上一篇[javascript基础]基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道 ...

  8. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  9. javascript基础修炼(8)——指向FP世界的箭头函数

    一. 箭头函数 箭头函数是ES6语法中加入的新特性,而它也是许多开发者对ES6仅有的了解,每当面试里被问到关于"ES6里添加了哪些新特性?"这种问题的时候,几乎总是会拿箭头函数来应 ...

随机推荐

  1. Java实现 LeetCode 821 字符的最短距离(暴力)

    821. 字符的最短距离 给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleet ...

  2. Java实现 LeetCode 726 原子的数量(递归+HashMap处理)

    726. 原子的数量 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表 ...

  3. CSS 简介/特点/优势/给特定浏览器提供不同样

    1.CSS简介 CSS全称Cascading Style Sheet,可译为“层叠样式表”或“级联样式表”,通常称为CSS样式或者样式表.CSS是一些纯文本内容,文件格式为.css. 2.CSS特点 ...

  4. 【JAVA进阶架构师指南】之五:JVM性能调优

    前言   首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了.   好了,进入正题,让我们来聊聊JVM篇最后一个章节 ...

  5. 基于mykernel2.0编写一个操作系统内核

    基于mykernel2.0编写一个操作系统内核 一. 实验准备 详细要求 基于mykernel 2.0编写一个操作系统内核 按照https://github.com/mengning/mykernel ...

  6. Numpy中的广播机制,数组的广播机制(Broadcasting)

    这篇文章把numpy中的广播机制讲的十分透彻: https://jakevdp.github.io/PythonDataScienceHandbook/02.05-computation-on-arr ...

  7. .NET Framework、.NET Core 和 .NET 5+ 的产品生命周期

    本文整理记录了 .NET Framework..NET Core 和 .NET 各个版本的产品支持周期和操作系统兼容性. 早于 .NET Framework 2.0 和 .NET Core 2.1 的 ...

  8. cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法

    //*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...

  9. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  10. 谈谈java中的并发(一)

    一.并发的定义 并发:对于这个概念一直就是没怎么搞懂,就是感觉特别的生疏,(自己从从字面上理解就是多个东西,一起出发),所以就上网上查了一些资料: 同时拥有两个或多个线程,如果程序在单核处理器上运行, ...